①卷积层(conv)——————>用于提取特征
②池化层(pooling)——————>用于特征选择(也叫下采样)
③全连接层(fc(fully connected)层)———————>用于整合全局信息进行分类
首先谈谈卷积层,事实上,卷积层和全连接层是可以相互转换的,卷积层就是进行①局部连接、②权值共享的进行特征提取的全连接层
是通过卷积核,来提取图片的局部特征
神经网络前部卷积层有小的感受野,可以捕捉图像局部、细节信息。
后面的卷积层感受野逐层加大,用于捕获图像更复杂,更抽象的信息。
无论输入图片多大,卷积层的参数规模都是固定的
但为什么CNN的输入图像大小需要是固定的呢?
——是因为fc层的限制,我们在下面来说
常见的操作有Max pooling和Average pooling,二者都是进行下采样,降低了图片的分辨率(同时进行了特征的选择)
注意:pooling也会增大感受野
即 将经过卷积层和池化层的输出摊平(flatten),局部特征“摊平”之后就变成了全局特征
很多人问为什么要用全连接层?尤其是涉及过一些目标检测(如:YOLOv1骨干网络DetNet)、图像分割(如:FCN、U-Net)更会发问,为什么这些里面没有fc层???
因为,fc层整合了前面卷积层和池化层提取的高维特征信息,将它们整合成了全局信息。
这种整合的代价是什么?
位置!!!
fc层“整合”后,会损失掉许多位置信息(想想,将一些三维度的”正方体“摊平成一维的向量,经过一系列运算,你还能知道它原本在哪吗?
这也是为什么不能在目标检测、图像分割此类不仅对语义信息要求严格,也对定位信息要求严格的任务中采用全连接层
全连接层,是用于分类的,用于分类的,用于分类的
下面介绍fc层的一些理解[^1]
理解1:
卷积取的是局部特征,全连接就是把以前的局部特征重新通过权值矩阵组装成完整的图。
因为用到了所有的局部特征,所以叫全连接。
理解2:
从卷积网络谈起,卷积网络在形式上有一点点像咱们正在召开的“人民代表大会制度”。卷积核的个数相当于候选人,图像中不同的特征会激活不同的“候选人”(卷积核)。
池化层(仅指最大池化)起着类似于“合票”的作用,不同特征在对不同的“候选人”有着各自的喜好。
全连接相当于是“代表普选”。所有被各个区域选出的代表,对最终结果进行“投票”,全连接保证了感受野(receptive field) 是整个图像,既图像中各个部分(所谓所有代表),都有对最终结果影响的权利。
理解3:
假设你是一只小蚂蚁,你的任务是找小面包。你的视野还比较窄,只能看到很小一片区域。当你找到一片小面包之后,你不知道你找到的是不是全部的小面包,所以你们全部的蚂蚁开了个会,把所有的小面包都拿出来分享了。全连接层就是这个蚂蚁大会~
全连接层将特征representation(n. 代表)整合到一起,输出为一个值。
这样做,有一个什么好处?就是大大减少特征位置对分类带来的影响。
(从上图我们可以看出,猫在不同的位置,输出的feature值相同,但是位置不同。
对于电脑来说,特征值相同,但是特征值位置不同,那分类结果也可能不一样。)
** 这时全连接层filter的作用就相当于**
喵在哪我不管,我只要喵,于是我让filter去把这个喵找到,
实际就是把feature map 整合成一个值,这个值大,有喵,这个值小,那就可能没喵
和这个喵在哪关系不大了,鲁棒性有大大增强。
因为空间结构特性被忽略了,所以全连接层不适合用于在方位上找Pattern的任务,比如segmentation。
全连接层中一层的一个神经元就可以看成一个多项式,
我们用许多神经元去拟合数据分布
但是只用一层fully connected layer 有时候没法解决非线性问题,
而如果有两层或以上fully connected layer就可以很好地解决非线性问题了
我们都知道,全连接层之前的作用是提取特征
全连接层的作用是分类
补充一点:全连接层参数很多,一般占网络的60%-80%
当网络结构确定,参数的规模就定下来了
对于卷积层来说,即卷积核的大小
对于fc层来说,即神经元的数目
如:pytorch代码
nn.Linear(K1,K2),即K1,K2要事先确定
当在此处规定了神经元的数目,则规定了经过卷积、池化后的(Nc,Nh,Nw)摊平后的K维向量的维数一定
而 K = Nc * Nh * Nw
而Nc(通道数)只与卷积层和池化层的参数有关
Nh,Nw与输入图片的参数Ih,Iw之间的比例关系在卷积层和池化层参数给定之后是一定的
故K一定后,Nh与Nw就一定了,即输入图片大小被fc层参数限制
那么如何解决呢?
——用全卷积层代替全连接层(详见FCN论文)
输入层:
①统一输入图像尺寸
一般为RGB图像:3 * H * W
②进行Initial Normalization归一初始化到【0,1】
③有时还会使用PCA白化
层间:
为防止数据分布在传输过程中发生较大变化,导致参数难以训练、不适应大学习率、梯度消失等问题
可采用批标准化(Batch Normalization)即BN层(详见BN算法论文)
p.s.:
一定了解一下ResNet残差网络,分类任务的绝对backbone!
还可以了解一下VGG、Google Net(Inception Net)等知名网络,都是建立在CNN的基础上
[1]https://blog.csdn.net/m0_37407756/article/details/80904580