概念
卷积神经网络(Convolutional Neural Network,CNN)最早由纽约大学的Yann Lecun提出,他构造的LeNet神经网络中使用了多层的卷积操作。下图所示为LeNet5的结构:
相比于全连接神经网络,卷积层的本质区别在于层与层之间使用了局部连接和权值共享的方式。
局部连接:卷积操作之后的每个值仅对应着原图的一小块区域,原图上的这块局部区域称作感受野(receptive field)(也就是说,感受野的定义为一个像素对应回原图的区域大小)。局部连接的思想,受启发于生物学里面的视觉系统,视觉皮层的神经元就是局部接受信息的。
权值共享:由于卷积核的参数固定,因此这相当于是两层网络之间的一些连接使用的是相同的参数。
通过局部连接和权值共享,一方面减少了权值的数量使得网络易于优化,另一方面降低了模型的复杂度,也就是减小了过拟合的风险。该优点在网络的输入是图像时表现的更为明显,使得图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建的过程,在二维图像的处理过程中有很大的优势,如网络能够自行抽取图像的特征包括颜色、纹理、形状及图像的拓扑结构,在处理二维图像的问题上,特别是识别位移、缩放及其他形式扭曲不变性的应用上具有良好的鲁棒性和运算效率等。
卷积操作
原理
在卷积神经网络中,卷积指的是在输入数据上使用一个滑动窗口不断移动,并不断地将滑动窗口中的数值与一个滤波矩阵(一组固定的权重,所以又可以看做一个恒定的滤波器)做内积(逐个元素相乘再求和)计算,这个滤波矩阵被称为卷积核。通过这种计算方式,便实现了卷积神经网络层之间的局部连接。
卷积核的局部性属性意味着它只关注局部特征,局部的程度取决于卷积核的大小。从信号处理的角度考虑,时域卷积对应频域相乘。所以原图像与卷积核的卷积操作,其实是对频域信息进行选择。比如,图像中的边缘和轮廓属于是高频信息,图像中某区域强度的综合考量属于低频信息。在传统图像处理中,这是指导设计卷积核的一个重要因素。
同DNN一样,卷积核中的每一个位置都对应于一个权值\(w\),同时整个卷积核也可以具有一个偏置\(b\)。这个卷积核在对输入的不同部分做卷积时,使用的是同样的参数(即参数共享)。这些参数不需要提前设定,可以在网络的学习过程中自动优化。需要注意的是,由于输入可能是高维变量(例如输入为三维立体图像,或者使用多个卷积核卷积操作之后的中间结果),因此卷积核的大小也可能是高维的。
下图为卷积操作的一个动画:
关于卷积的详细解释参考:https://www.zhihu.com/question/22298352
需要注意的是,卷积神经网络真正使用时,还需要配合池化、激活函数等,以获得更强的表达能力。但模式蕴含在卷积核中,如果没有非线性激活函数,网络仍能学到模式,但表达能力会下降。例如摘自参考文献6的图表,说明了激活函数对于网络预测准确度的影响:
可视化
不同的卷积核可以对图像做不同的处理,或者说不同的卷积核可以从图像中抽取到图片的不同特征。可以认为卷积核定义了某种模式,卷积运算是在计算每个位置与该模式的相似程度,或者说每个位置具有该模式的分量有多少,当前位置与该模式越像,响应越强。
下图所示为使用不同的卷积核在处理完一张图像后的效果。从中我们可以看到,在使用边缘检测的卷积核时,图像的边缘部分明显比其它部分有着更强的相应,也就是说卷积核提取出了图像的边缘特征:
在实际任务中,我们通常需要神经网络具有更强的泛化能力,这就需要我们使用多层卷积来将简单模式组合成复杂模式。下图摘自参考文献5,这些灰色的图像是通过选取每个卷积核在测试集中激活值最强的9幅原图,并对这些原图在卷积操作后的图案做反卷积得到的。从中可以看到,不同的卷积核能够识别出图像中不同的特征。当然也可以看到,浅层的卷积层学到的主要是图像的纹理、边缘等信息;而深层的卷积层学到的特征更加复杂,主要是人脸、车轮、动物等等,可以理解为是浅层卷积层特征的组合。
卷积核类型
目前关于CNN的研究中,卷积核的种类比较多,但是常用的主要是下面将要详细介绍的4种卷积操作。
标准卷积
标准卷积是最常用的卷积,连续紧密的矩阵形式可以提取图像区域中相邻像素之间的关联性,例如一个\(3\times3\)的卷积核可以获得\(3\times3\)的感受野。如下图所示:
其中涉及到的一些参数:
卷积核大小(Kernel Size):卷积核定义了卷积的大小范围,二维卷积核中最常见的就是\(3\times3\)的卷积核。
通常卷积核都设置为奇数大小的正方形,并且倾向于使用较小的卷积核。从数学的角度考虑,例如两个\(3\times3\)的卷积核所具有的感受野与\(5\times5\)的卷积核是相同的,但是两个\(3\times3\)的卷积核所需的参数更少,且具有更多的非线形变换。
但是目前也有一些AutoML相关的研究表明,自动搜索出的最优网络参数中包含了\(5\times5\)、\(7\times7\)这种稍大的卷积核,甚至还有一些长方形的卷积核;部分研究结果也表明,使用\(5\times5\)、\(7\times7\)的卷积核会比\(3\times3\)卷积核的效果要好。不过基于目前的研究结果能够肯定的是,当卷积核变得过大,如\(9\times9\)及以上的时候,不仅模型准确度会下降,而且网络参数也会急剧上升(相当于越来越接近于全连接神经网络)。
步长(Stride):步长定义了当卷积核在图像上面进行卷积操作的时候,每次卷积跨越的长度。在默认情况下,步长通常为 1,但我们也可以采用步长是 2 的下采样过程,类似于 MaxPooling 操作。
填充(Padding):对图像的边缘是否做填充操作。通过填充操作,可以改变卷积操作之后的图像尺寸。
扩张卷积
扩张卷积(Dilated Convolution)也被称为空洞卷积或者膨胀卷积,是在标准的卷积核中注入空洞,以此来增加模型的感受野。扩张卷积为卷积层引入了另一个参数,称为扩张率,它指的是扩张卷积核处理数据时各个值之间的间距。例如,扩张率为2的\(3\times3\)内核与\(5\times5\)内核具有相同的视野,而仅使用9个参数。
因此,扩张卷积相同的计算成本提供了更宽的视野。扩张卷积在实时分割领域中特别受欢迎。当我们需要广泛的视野并且无法承受多个卷积或更大的核所带来的计算开销,便可以考虑使用扩张卷积。
转置卷积
转置卷积的操作如下图所示,其中空白部分代表使用0进行填充:
转置卷积(Transpose Convolution)也被称为反卷积,在深度学习中表示为卷积的一个逆向过程,可以根据卷积核大小和输出的大小,恢复卷积前的图像尺寸,而不是恢复原始值。
与标准卷积操作相比,转置卷积的步骤相当于先根据步长将输入进行分割并使用0填充到中间,同时按照卷积核的大小对输入进行四边补0。然后将卷积核旋转180°,在新的输入上面直接卷积。如下图所示:
对于普通卷积和转置卷积之间的关系,可以用下面的一幅图来表示:
深度可分离卷积
深度可分离卷积分为逐通道卷积和逐点卷积两种。
逐通道卷积指的是一个卷积核只负责一个通道,或者说一个通道只被一个卷积核卷积。如下图所示:
而逐点卷积其实就相当于是\(1\times 1\times N\)的卷积核,其中\(N\)代表通道数。如下图所示:
一些网络结构中使用到了\(1\times 1\)的卷积核,它的作用为提升或降低通道数(或称为降维/升维)、实现跨通道的信息交互、增加非线性,同时它也可以看成是一种特殊的全连接。
池化操作
原理
池化操作(Pooling)是CNN中非常常见的一种操作,在构建卷积神经网络时,往往会用在卷积层之后,用于实现对卷积后图像的进一步降维。池化操作通常也叫做子采样(Subsampling)或下采样(Downsampling)。
池化操作与卷积操作类似,也是在图像中使用一个固定大小的滑动窗口进行移动,并按照一定的规则计算滑动窗口内的数值。但是区别在于,池化层并没有可学习参数。下图所示为最大值池化和均值池化的计算过程:
池化层主要的作用:
- 在保留主要特征的同时实现下采样(降维),从而去除一些冗余信息,实现对特征的压缩。这一操作可以减少参数量,从而加快计算速度,也可以一定程度上缓解过拟合问题。
- 可以扩大感受野。
- 可以实现形状不变性,包括平移不变性、旋转不变性和尺度不变性。
- 将变长的输入整理为定长输出。
可视化
如下是一个对卷积后的图像做最大池化前后的对比图:
从中可以看到,在池化操作之后,图像的尺寸降低,同时也变得更加模糊。但是图像中的重要信息仍然被保留了下来。
池化层类型
与卷积层类似,在目前CNN相关的研究中池化层的种类也有很多,但是比较常用的为下面几种:
- 最大值池化(Max Pooling):返回池化窗口内的最大值
- 平均值池化(Average Pooling):返回池化窗口内的平均值
- 随机池化(Stochastic Pooling):在池化窗口内随机选取一个值
- 空间金字塔池化(Spatial Pyramid Pooling):如下图所示,将任意大小的图像分割成固定数目的格子(也就是说对于不同大小的输入,每个格子内部的像素点数目也不同),然后对每个格子内的数据做池化操作。通过这种操作,可以使得网络的输入可以为任意大小的图片,SPP会自动将结果变为相同的尺度。
经典网络架构
AlexNet
下图所示为AlexNet的网络结构:
AlexNet的创新之处在于使用了ReLU非线性激活函数、Dropout、数据增强(生成平移、翻转、RGB通道变化之后的图像)等技术,同时使用了更深的网络。
VGGNet
下图所示为VGG-16的网络结构:
VGG可以看作是加深版的AlexNet,同时在VGG网络中也使用了更小尺寸的卷积核。为了解决权重初始化问题,VGG网络使用了预训练的方式,首先训练网络的一部分,在这部分稳定之后,再基于这一基础之上对网络进行逐渐加深。
GoogLeNet
GoogLeNet的网络结构如下:
GoogLeNet的创新之处在于引入了下图所示的Inception结构:
GoogLeNet网络结构中有3个LOSS单元,这样的设计是为了帮助网络的收敛。在中间层加入辅助计算的LOSS单元,目的是计算损失时让低层的特征也有很好的区分能力,从而让网络更好地被训练。在论文中,这两个辅助LOSS单元的计算被乘以0.3,然后和最后的LOSS相加作为最终的损失函数来训练网络。
GoogLeNet还有一个闪光点,就是将后面的全连接层全部替换为简单的全局平均pooling,这使得最后参数会变的更少。
ResNet
当网络层数过深时,不可避免会出现梯度消失的问题,从而影响网络的训练。ResNet引入了如下图所示的残差模块,从而一定程度上缓解了梯度消失:
通过引入残差单元,网络的层数也可以达到百层的级别。
DenseNet
DenseNet的结构如下:
DenseNet 是一种具有密集连接的卷积神经网络。在该网络中,任何两层之间都有直接的连接,也就是说,网络每一层的输入都是前面所有层输出的并集,而该层所学习的特征图也会被直接传给其后面所有层作为输入。
DenseNet则是让\(l\)层的输入直接影响到之后的所有层,它的输出为:\(x_l=H_l([x_0,x_1,…,x_{l−1}])\),其中\([x_0,x_1,…,x_{l−1}]\)就是将之前的feature map以通道的维度进行合并。并且由于每一层都包含之前所有层的输出信息,因此其只需要很少的特征图就够了,这也是为什么DenseNet的参数量较其他模型大大减少的原因。这种dense connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象。
参考
- 卷积神经网络超详细介绍_呆呆的猫的博客-CSDN博客_卷积神经网络
- 一个卷积神经网络的交互型展示:https://www.cs.ryerson.ca/~aharley/vis/conv/
- 另一个卷积神经网络的交互型展示:https://poloclub.github.io/cnn-explainer/
- 能否对卷积神经网络工作原理做一个直观的解释? - 知乎 (zhihu.com)
- Deep Learning(深度学习)学习笔记整理系列之(七)_zouxy09的专栏-CSDN博客_深度学习笔记
- 卷积神经网络之卷积计算、作用与思想 - shine-lee - 博客园 (cnblogs.com)
- https://arxiv.org/pdf/1311.2901.pdf
- https://arxiv.org/pdf/1606.02228.pdf
- 卷积神经网络四种卷积类型_喜欢打酱油的老鸟-CSDN博客_卷积类型
- 卷积神经网络的卷积核大小、卷积层数、每层map个数都是如何确定下来的呢? - 知乎 (zhihu.com)
- 一文读懂卷积神经网络中的1x1卷积核 - 知乎 (zhihu.com)
- https://zhuanlan.zhihu.com/p/48501100
- 抽丝剥茧,带你理解转置卷积(反卷积)_史丹利复合田的博客-CSDN博客_转置卷积
- 深度可分离卷积 - 知乎 (zhihu.com)
- CNN网络的pooling层有什么用? - 知乎 (zhihu.com)
- 关于不同种类池化层的综述文:https://arxiv.org/ftp/arxiv/papers/2009/2009.07485.pdf
- https://blog.csdn.net/Sakura55/article/details/81559881
- https://www.cnblogs.com/skyfsm/p/8451834.html