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

我将从以下几个方面来进行解说:
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。

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

扫描二维码关注公众号,回复: 11894115 查看本文章
    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

猜你喜欢

转载自blog.csdn.net/jialibang/article/details/107983343