CNN网络层详解

时间:2024-03-31 13:52:49

  常见的CNN网络主要包含下面几个网络结构:卷积层、**函数、池化层和全连接层。下面对这几个结构在卷积神经网络中的作用进行介绍。
一、卷积层
1.1 卷积操作和卷积层的作用
  在介绍卷积层的作用之前,自己先介绍一下卷积操作的概念。以下图为例,较大网格表示一幅图片,有颜色填充的网格表示一个卷积核,卷积核的大小为3*3。假设我们做步长为1的卷积操作,表示卷积核每次向右移动一个像素(当移动到边界时回到最左端并向下移动一个单位)。卷积核每个单元内有权重,下图的卷积核内有9个权重。在卷积核移动的过程中将图片上的像素和卷积核的对应权重相乘,最后将所有乘积相加得到一个输出。下图经过卷积后形成一个6*4的图。

CNN网络层详解

  卷积层的每一个卷积滤波器作用于整个感受野中,对输入图像进行卷积,卷积的结果构成了输入图像的特征图,从而经过卷积层后就提取出了图像的局部特征。所以卷积层的主要作用就是可以利用不同的卷积核(也叫滤波器)来提取图像不同的特征。它是识别图像最核心的部分。
1.2 卷积层的特点
  在这里既然讲到了卷积层,就顺便简单提一下CNN网络在卷积层所做的工作,这也就是CNN的优势所在,想详细了解这一块的话可以看我之前的博客哈。
  第一个特点和优势就是:局部感知
  在传统神经网络中每个神经元都要与图片上每个像素相连接,这样的话就会造成权重的数量巨大造成网络难以训练。而在含有卷积层的神经网络中每个神经元的权重个数都时卷积核的大小,这样就相当于神经元只与对应图片部分的像素相连接。这样就极大的减少了权重的数量。同时我们可以设置卷积操作的步长,假设将上图卷积操作的步长设置为3时每次卷积都不会有重叠区域(在超出边界的部分补自定义的值)。局部感知的直观感受图常如下图:

CNN网络层详解

  注意:使用局部感知的原因是一般人们认为图片中距离相近的部分相关性较大,而距离比较远的部分相关性较小。在卷积操作中步长的设置就对应着距离的远近。但是步长的设置并无定值需要使用者自己尝试。
  第二个特点和优势就是:参数共享
  卷积核的权重是经过学习得到的,并且在卷积过程中卷积核的权重是不会改变的,这就是参数共享的思想。还以上面的那张图为例,通过参数共享后,可以发现原来需要学习100M个参数现在只需要学习100个参数(卷积核是10*10的大小),假设用100个卷积核来进行卷积,也仅仅只需要学习100*100=104个参数,远远低于100M=106
  可以发现我们通过一个卷积核的操作提取了原图的不同位置的同样特征。简单来说就是在一幅图片中的不同位置的相同目标,它们的特征是基本相同的。其过程如下图所示:

CNN网络层详解

  第三个特点是:多卷积核
  我们用一个卷积核操作只能得到一部分特征可能获取不到全部特征,所以为了能够得到图像更多的特征信息我们引入了多核卷积。用多个卷积核来学习图像更多的不同的特征(每个卷积核学习到不同的权重)。主要注意的是在多核卷积的过程中每一层的多个卷积核的大小应该是相同的。

二、**函数
  这里主要解释一下在神经网络中为什么要使用**函数以及它的作用是什么?
  使用**函数的原因在于,以两类数据的分类为例,这些数据真正能线性可分的情况还是比较少的,此时如果数据不是线性可分的我们又该如何分类呢?这个时候我们就无法再简单利用一条直线来对数据进行很好的划分,这时我们需要加入非线性的因素来对数据进行分类。所以可以判断出**函数的作用是给神经网络加入一些非线性因素,由于线性模型的表达能力不够,故**函数的加入可以使得神经网络更好地解决较为复杂的问题,从而使得模型的表达能力更强。
  如今常见的**函数有sigmoid()、tanh()、relu()等。

三、池化层
3.1 池化层操作
  池化操作的具体过程如下:

CNN网络层详解

  池化层的具体操作与卷基层的操作基本相同,只不过池化层的卷积核为只取对应位置的最大值或平均值(最大池化、平均池化),并且不会随着反向传播发生变化。一般池化层的filter取2*2,最大取3*3,stride取2,特征信息压缩为原来的1/4。
3.2 池化层的作用
  池化层可对提取到的特征信息进行降维,一方面使特征图变小,简化网络计算复杂度并在一定程度上避免过拟合的出现;一方面进行特征压缩,提取主要特征。
  最大池采样在计算机视觉中的价值体现在两个方面:(1)、它减小了来自上层隐藏层的计算复杂度;(2)、这些池化单元具有平移不变性,即使图像有小的位移,提取到的特征依然会保持不变。由于增强了对位移的鲁棒性,这样可以忽略目标的倾斜、旋转之类的相对位置的变化,以此提高精度,最大池采样方法是一个高效的降低数据维度的采样方法。
  需要注意的是:这里的pooling操作是特征图缩小,有可能影响网络的准确度,因此可以通过增加特征图的深度来弥补(这里的深度变为原来的2倍)。

三、全连接层
  全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和**函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。但是FC层参数个数非常多,容易引起过拟合。
  目前由于全连接层参数冗余(仅全连接层参数就可占整个网络参数80%左右),近期一些性能优异的网络模型如ResNet和GoogLeNet等均用全局平均池化(global average pooling,GAP)取代FC来融合学到的深度特征,最后仍用softmax等损失函数作为网络目标函数来指导学习过程。实验发现,用GAP替代FC的网络通常有较好的预测性能。
  全局平均池化(GAP)的思想就是:用 feature map 直接表示属于某个类的 confidence map,比如有10个类,就在最后输出10个 feature map,每个feature map中的值加起来求平均值,然后把得到的这些平均值直接作为属于某个类别的 confidence value,再输入softmax中分类, 更重要的是实验效果并不比用 FC 差。
  GAP的优势是:1.因为FC的参数众多,这么做就减少了参数的数量(在最近比较火的模型压缩中,这个优势可以很好的压缩模型的大小)。2.因为减少了参数的数量,可以很好的减轻过拟合的发生。
  这种直接用 feature map 表示属于某个类的 confidence map 的做法很符合CNN的思想。比如最后要分10个类,假设在有 FC 的 network 中,FC 前面一层的feature map 用 A 表示,A 经过 FC 的作用得到了一个 10 维的向量(假设用 C 表示),然后输入softmax 等分类器中分类。既然CNN的学习能力很强,那为什么不直接让 CNN 学习输出 C(而不是 A)呢?可以看到这种思想和CNN结合的很好。