欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

卷积神经网络中各个卷积层的设置及输出大小计算的详细讲解

程序员文章站 2022-04-30 14:02:17
...

我将从以下几个方面来进行解说:
1.卷积神经网络的结构
2.卷积神经网络的计算
3.以AlexNet为例进行详细讲解

4.常见的两个卷积层设置的问题

1.卷积神经网络的结构

卷积神经网络(CNN)由输入层、卷积层、**函数、池化层、全连接层组成,即INPUT(输入层)-CONV(卷积层)-RELU(**函数)-POOL(池化层)-FC(全连接层)
我们用一个图进行展示:

卷积神经网络中各个卷积层的设置及输出大小计算的详细讲解

2.卷积神经网络的计算

卷积神将网络的计算公式为:
N=(W-F+2P)/S+1
其中N:输出大小
W:输入大小
F:卷积核大小
P:填充值的大小
S:步长大小
下面举个例子看一下:

   nn.Conv2d(in_channels=3,out_channels=96,kernel_size=11,stride=4,padding=2)

卷积一层的几个参数:
in_channels=3:表示的是输入的通道数,由于是RGB型的,所以通道数是3.
out_channels=96:表示的是输出的通道数,设定输出通道数的96(这个是可以根据自己的需要来设置的)
kernel_size=12:表示卷积核的大小是12x12的,也就是上面的 “F”, F=12
stride=4:表示的是步长为4,也就是上面的S, S=4
padding=2:表示的是填充值的大小为2,也就是上面的P, P=2

假如你的图像的输入size是256x256的,由计算公式知N=(256-12+2x2)/4+1=63,也就是输出size为63x63的

3.以AlexNet为例进行详细讲解

AlexNet网络结构图如下图所示:

卷积神经网络中各个卷积层的设置及输出大小计算的详细讲解

有结构图可以看出该网络有8层:五个卷积层,三个全连接层。

我们利用的框架是pytorch。

卷积神经网络的设置包括卷积层的设置以及正反向传播的设置
卷积层的设置代码如下:

    self.conv1 = torch.nn.Sequential(   #input_size = 227*227*3
        torch.nn.Conv2d(in_channels=3,out_channels=96,kernel_size=11,stride=4,padding=0),
        torch.nn.ReLU(),
        torch.nn.MaxPool2d(kernel_size=3, stride=2) #output_size = 27*27*96
    )
    self.conv2 = torch.nn.Sequential(   #input_size = 27*27*96
        torch.nn.Conv2d(96, 256, 5, 1, 2),
        torch.nn.ReLU(),
        torch.nn.MaxPool2d(3, 2)    #output_size = 13*13*256
    )
    self.conv3 = torch.nn.Sequential(   #input_size = 13*13*256
        torch.nn.Conv2d(256, 384, 3, 1, 1),
        torch.nn.ReLU(),    #output_size = 13*13*384
    )
    self.conv4 = torch.nn.Sequential(   #input_size = 13*13*384
        torch.nn.Conv2d(384, 384, 3, 1, 1),
        torch.nn.ReLU(),    #output_size = 13*13*384
    )
    self.conv5 = torch.nn.Sequential(   #input_size = 13*13*384
        torch.nn.Conv2d(384, 256, 3, 1, 1),
        torch.nn.ReLU(),
        torch.nn.MaxPool2d(3, 2)    #output_size = 6*6*256
    )

self.dense = torch.nn.Sequential(
    torch.nn.Linear(9216, 4096),
    torch.nn.ReLU(),
    torch.nn.Dropout(0.5),
    torch.nn.Linear(4096, 4096),
    torch.nn.ReLU(),
    torch.nn.Dropout(0.5),
    torch.nn.Linear(4096, 50)
)

输入为227x227x3的,也就是所size为227x227的,通道数是3,为RGB型图像, 卷积1层输出27x27x96

卷积2层最终输出为13x13x256,本层的神经元数目为27x27x256 =186642个
卷积3层最终输出为13x13x384,本层的神精元数目为13x13x384 =64896个
卷积4层最终输出为13x13x384,本层的神精元数目为13x13x384 = 64896个
卷积5层最终输出为6x6x256,本层的神精元数目为6x6x256=9216个

 

全连接层(线性+**)的作用主要是负责逻辑推断,所有的参数都必须学习得到。

正反向传播的顺序设置代码如下:

def forward(self, x):   #正向传播过程
    conv1_out = self.conv1(x)
    conv2_out = self.conv2(conv1_out)
    conv3_out = self.conv3(conv2_out)
    conv4_out = self.conv4(conv3_out)
    conv5_out = self.conv5(conv4_out)
    res = conv5_out.view(conv5_out.size(0), -1)
    out = self.dense(res)
    #print (out)
    return out

4.常见的两个卷积层设置问题

 self.conv1 = nn.Conv2d(3, 6, 5)

问题一:为什么是cove2d?

cove1d:用于文本数据,只对宽度进行卷积,对高度不进行卷积
cove2d:用于图像数据,对宽度和高度都进行卷积

问题二:为什么卷积核大小5x5写一个5?

Conv2d(输入通道数, 输出通道数, kernel_size(长和宽)),当卷积核为方形时,只写一个就可以
卷积核不是方形时,长和宽都要写:

self.conv1 = nn.Conv2d(3, 6, (5,3))

问题三:池化层的作用

maxpooling有局部不变性而且可以提取显著特征的同时降低模型的参数,从而降低模型的过拟合。
因为只是提取了显著特征,而舍弃了不显著的信息,是的模型的参数减少了,从而一定程度上可以缓解过拟合的产生。

转载自:https://blog.csdn.net/sinat_42239797/article/details/90646935?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~baidu_landing_v2~default-1-90646935.nonecase

相关标签: pytorch 使用