CNN——经典永不过时!

696 阅读8分钟

声明:本博客为记录自己的学习过程,不做商业用途,引用部分会注明

本文基于:【综述】一文读懂卷积神经网络(CNN) - 知乎 (zhihu.com)

在写blog记录学习的过程中,发现自己的基础不是很好,于是决定写几篇基础性工作的blog,能写好就肯定学会了,方便后续的学习。因此,本系列blog更侧重于原理的解释和学习。

介绍

什么是卷积神经网络?

百度定义如下:

卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks)。

CNN由纽约大学的Yann Lecun于1998年提出(LeNet-5),其本质是一个多层感知机,成功的原因在于其所采用的局部连接和权值共享的方式:一方面减少了权值的数量使得网络易于优化;另一方面降低了模型的复杂度、减小了过拟合的风险。 

在我之前的blog中提到的AlexNet,2012年取得ImageNet比赛的分类任务的冠军,使得卷积神经网络真正爆发。如今的卷积神经网络(CNN)是一种带有卷积结构的深度神经网络,卷积结构可以减少深层网络占用的内存量,其三个关键的操作——局部感受野、权值共享、pooling层,有效地减少了网络的参数个数,缓解了模型的过拟合问题。

在我们日常生活中,其实已经不知不觉中有很多应用了,例如object detection以及face attributes等等。比较有趣的是MobileNets,他用比较简易的结构,减小了图片的尺寸大小,使得模型训练好之后,能够用手机端跑起来,性能也比较好。

卷积

这里有一篇文章,详细介绍了卷积的计算,非常通俗易懂:

原来卷积是这么计算的 - 知乎 (zhihu.com)

图像

局部相关性:单独的像素值没有意义,相邻像素组合在一起形成特征。(能做卷积的原因)

平移不变性:图片的特征不受位置影响

在ImageNet分类任务中,通常设置5次下采样,并且考虑到其原始图像大多数在300分辨率左右,所以把最后一个卷积特征大小设定为7×7,将输入尺寸固定为224×224×3。在目标检测任务中,很多采用的是416×416×3的输入尺寸,当然由于很多目标检测模型是全卷积的结构,通常可以使用多尺寸训练的方式,即每次输入只需要保证是32×的图像尺寸大小就行,不固定具体数值。但这种多尺度训练的方式在图像分类当中是不通用的,因为分类模型最后一层是全连接结构,即矩阵乘法,需要固定输入数据的维度。

特点

  • 可以处理高维数据
  • 卷积核减少了参数的数量
  • 可以自动选取特征,不需要太多手动选择的干预
  • 需要调参
  • 需要大量数据训练
  • 计算量大
  • 可解释性不强

原理

对比全连接神经网络,卷积神经网络的参数更少,在反向传播的过程中,更新的参数更少,极大程度减小了运算量。如果我用一大堆不同卷积核去不停的更新权重,就得到了不同的特征的提取。卷积神经网络尾部也连接了一个全连接层,但此时全连接层接受的是特征信息而非图像信息。前面的卷积神经网络做一个特征的提取,后面的全连接层做的是分类。用专业术语来说,前者叫编码,后者叫解码

接下来进入详细介绍部分

卷积层(convolutional layer):

是通过输入数据,计算卷积,得到一个Feature map,如下图所示:

感受野(Receptive Field):指特征图上的某个点能看到的输入图像的区域,即特征图上的点是由输入图像中感受野大小区域的计算得到的。卷积神经网络的卷积层如果设置的好的话,能够提取到很多特征,看的更深。相反,范围越小则表示其所包含的特征越趋向局部和细节。

深度卷积神经网络中靠前的层感受野较小,提取到的是图像的纹理、边缘等局部的、通用的特征;靠后的层由于感受野较大,提取到的是图像更深层次、更具象的特征。

因此在迁移学习中常常会将靠前的层的参数冻结(不参与训练,因为他们在迁移到新的场景之前已经具备了提取通用特征的能力),来节省训练的时间和算力消耗。

**权值共享:**在一个卷积核在和一个n通道的特征图(为方便理解,这里可以暂时理解为3通道的RGB输入图像)进行卷积运算时,可以看作是用这个卷积核作为一个滑块去“扫”这个特征图,卷积核里面的数就叫权重,这个特征图每个位置是被同样的卷积核“扫”的,所以权重是一样的,也就是共享。

卷积为什么能够做到特征提取呢?

kernel的通道与图像一致,卷积层输出的chaneel数=kernel总数。

计算某一次卷积核时,数字越大代表评分越高,代表越接近某一特征。利用下图中第一个卷积核在与原图完全一致的框内的评分为9(最高),代表这一特征最强,最左上角的部分评分为7,代表接近第一个kernel的特征。

以此类推不断计算,就可以得到一个feature map,如果在第一个kernel的某一个点的得分为9,就可以反推原图片的特征与第一个kenel一致,这样就完成了正反解释特征提取的介绍。

**填充(Padding):**在训练前,会给原图补充一个0的边缘,能够使算法关注图像边缘内容。如果kernel>1*1,而不进行填充,则像素点的遍历次数就会出现中间多边缘少的情况,这其实是不理想的。Zero-Padding可以设置为(K-1)/2,保持输入输出一致(针对于Stride为1)。

**步长(Stride):**如果设置稍微大一点的步长,可以节省很大的计算量

池化层(Pooling):比较常见的是max、average和adaptive等等。以max pooling为例,池化层可以看作是一个特殊的卷积层,遍历一个视野内的,找到最大的数据,然后填充到feature map。average pooling也是同理。

  • 利用特征不变性,压缩数据
  • 特征降维,去掉没用或者重复的信息
  • 减小过拟合

之前学习过的迁移学习也是类似的,我们可以直接把训练好的卷积神经网络的编码器部分拿出来,也就是把卷积层拿出来直接用,然后自己训练一个全连接层做分类就好了,可以节省很多时间,甚至都不需要对参数进行调整,当然也可以进行微调。

对于最大池化来说,max(x,y)函数的反向传播可以简单理解为将梯度只沿最大的数回传。

展平(Flatten):为了对接全连接神经网络,feature map是无法直接丢进去的,需要金国一个展平的操作,将空间信息丢失,构成以为数组输入全连接神经网络就行了。

下采样(Down-Sample):

**

下采样层有两个作用,一是减少计算量,防止过拟合,二是增大感受野,使得后面的卷积核能够学到更加全局的信息。下采样的设计有两种:

  • (1) 采用步长(stride)为2的池化层,如Max-pooling或Average-pooling,目前通常使用Max-pooling,因为它计算简单且最大响应能更好保留纹理特征;
  • (2) 采用步长(stride)为2的卷积层,下采样的过程是一个信息损失的过程,而池化层是不可学习的,用stride为2的可学习卷积层来代替pooling可以得到更好的效果,当然同时也增加了一定的计算量。

**

上采样(Up-Sampling):

**

在卷积神经网络中,由于输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小,而有时我们需要将图像恢复到原来的尺寸以便进行进一步的计算(如图像的语义分割),这个使图像由小分辨率映射到大分辨率的操作,叫做上采样,它的实现一般有三种方式:

  • 插值,一般使用的是双线性插值,因为效果最好,虽然计算上比其他插值方式复杂,但是相对于卷积计算可以说不值一提;
  • 转置卷积又或是说反卷积,通过对输入feature map间隔填充0,再进行标准的卷积计算,可以使得输出feature map的尺寸比输入更大;
  • Max Unpooling,在对称的max pooling位置记录最大值的索引位置,然后在unpooling阶段时将对应的值放置到原先最大值位置,其余位置补0。

**

**全连接(Full Connected)层:**它和常规神经网络中一样,它的本质其实就是矩阵乘法再加上偏差,输入一个(B, iC)的数据,权重为(iC, oC),那么输出为(B, oC),在多层感知机和分类模型最后一层常常见到。