我将从以下几个方面来进行解说:
1.卷积神经网络的结构
2.卷积神经网络的计算
3.以AlexNet为例进行详细讲解
4.常见的两个卷积层设置的问题
卷积神经网络(CNN)由输入层、卷积层、激活函数、池化层、全连接层组成,即INPUT(输入层)-CONV(卷积层)-RELU(激活函数)-POOL(池化层)-FC(全连接层)
我们用一个图进行展示:
卷积神将网络的计算公式为:
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的
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
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