一、 前言
卷积神经网络(convolutional neural network,CNN)是一种专门用来处理网格结构数据(例如图像数据)的前馈神经网络,是由生物学家Hubel和Wiesel在早期关于猫脑视觉皮层的研究发展而来。Hubel和Wiesel通过对猫脑视觉皮层的研究,发现初级视觉皮层中的神经元会响应视觉环境中特定的特征(称之为感受野机制),他们注意到了两种不同类型的细胞,简单细胞和复杂细胞。其中,简单细胞只对特定的空间位置和方向具有强烈的反应,而复杂细胞具有更大的接受域,其对于特征位置的微小偏移具有不变性。
通过之前的介绍,我们了解到全连接神经网络的工作原理。后一层中的每一个神经元的都和上一层的所有神经元之间有连接。虽然这种方式能够最大程度地让整个网络中的神经元都接收到各个维度的信息,但是它的缺点也很明显。首先,全连接网络的参数较多,这会增加模型训练的时间和难度,其次过多的参数会导致过拟合问题,使得模型的泛化能力不强。另外对于二维图像数据来说,其所具有的局部不变性特征对于全连接神经网络来说是难以被提取到的。
卷积神经网络一直是深度学习领域研究的核心,虽然早在上世纪90年代卷积神经网络就已经有一些实际场景的应用,但是其之所以能得到大范围的研究和使用,主要归功于近些年所取得的巨大进展。一个重要的节点是Hinton和他的学生Alex Krizhevsky利用他们设计的AlexNet[1]网络获得了2012年ImageNet竞赛的冠军。他们把图片分类的误差从原来的26%降低到15%,这在计算机视觉领域引起了不小的轰动,也是在那年之后,更多更深的神经网路一一被提出。直到现在,深度卷积神经网络已经发展成为计算机视觉领域中非常重要的一部分。
二、 卷积神经网络的特性
图像识别、分类是计算机视觉领域中比较常见的问题。对于计算机来说,一张图片就是一个大小为M*N*3的像素矩阵(以三通道图像为例),像素矩阵中每个像素的值在0到255之间。在给定这个像素矩阵作为输入后,要计算输出该图像所属的类别,这并不是一件十分简单的事。
当我们人在看到一幅图像时,首先都会关注图像中比较突出的、信息量比较大的局部特征,例如当我们看到一张宠物狗的图片时,我们的目光一般首先会落在狗的脸部以及四条腿等部位,然后根据经验,我们知道这是一张狗的图片。卷积神经网络借鉴了人类视觉系统的工作原理,卷积神经网络首先通过寻找这副图片的边缘或者曲线等得到一些低级特征,然后再通过一系列卷积层将这些低级的特征汇聚成更加高级的特征,由于这些高级的特征是由多个低级特征卷积构成,因此高级特征能覆盖原始图片更多的信息。
卷积神经网络主要有以下三大特性:
1. 局部连接
在第三章中,我们介绍的前馈神经网络,其相邻的两层之间,前一层的每一个神经元(或者是输入层的每一个单元)与后一层的每一个神经元都有连接,这种情况称为全连接。全连接网络的一个缺点就是参数太多,假设我们输入到神经网络中的是一张三通道的彩色图像,图像大小为128*128,因此输入层就有128*128*3=49150个单元。使用全连接网络的话,输入层到第一层隐藏层的每一个神经元都有49150个连接,随着网络层数的增加和每一层中神经元数量的增加,网络中的参数也会急剧增加。大量的参数不仅会拉低神经网络训练的效率,也很容易导致过拟合。
在卷积神经网络中,层与层之间不再是全连接,而是局部连接,具体的实现方法就是我们在4.2节中会介绍的卷积操作。
2. 权值共享
在卷积神经网络中,每一层卷积层中都会有一个或者多个卷积核(也称为滤波器),这些卷积核可以识别图像中某些特定的特征,每个卷积核会去滑动卷积上一层的特征图,在卷积的过程中卷积核的参数是不变且共享的。这样在训练过程中,与之前的全连接神经网络训练大尺度输入样本时需要大量参数相比,卷积神经网络只需要相对少很多的参数就可以完成训练。
3. 子采样
子采样层(subsampling layer)也称作池化层(pooling layer), 其作用是对上一卷积层进行聚合,使得上一层卷积层的输入特征图尺寸在经过该子采样层的聚合(也就是我们说的池化)后减小,从而降低特征数量,减少参数的数量。子采样层所做的事其实就是对上一层卷积层进行扫描,每次扫描特定区域,然后计算该区域特征的最大值(最大池化(maximum pooling))或者平均值(平均池化(mean pooling)),作为该区域特征的表示。
以上三个特征使得卷积神经网络具有一定程度上的缩放、平移和旋转不变性,并且相较于全连接神经网络,其网络参数也少了很多。
三、 卷积层
1. 什么是卷积
卷积(Convolution)是分析数学中一种重要的运算,有着非常广泛的运用,在图像处理中,常用的是二维卷积。以单通道的灰度图像为例,对图像进行卷积操作,就是使用一个卷积核(也称滤波器,在本书中统一称为卷积核)分别与图像的同大小区域进行点乘,卷积核依次从左往右从上往下滑过该图像的所有区域,点乘后得到的矩阵其各个位置上的值累加,作为卷积后图像上的像素值。这种将图像和卷积核进行按位点乘后求和的操作,就是卷积神经网络中的卷积操作。
假定有一个图像X,其大小为M*N,给定一个卷积核W,其大小为m*n,则卷积的公式可定义为:
![dc7af94c7952ceaf92c4eaf8f95feb94.png](https://i-blog.csdnimg.cn/blog_migrate/bcb050b78e1c06025b623a30629ee648.jpeg)
我们看一个简单的例子,如图1所示。我们有一张大小为5*5的图像(单通道),X是其像素矩阵,矩阵W为卷积核,其大小为3*3,矩阵Y是卷积得到的结果,称为特征映射或特征图(feature map)。根据上式,我们可以计算y11的值为:
![aa79615c4a7c7db25e8c0d8a388a7829.png](https://i-blog.csdnimg.cn/blog_migrate/e1e83d8af57910ce340d35899e03f3cd.jpeg)
![4633920456cb5704093aab16f44384c4.png](https://i-blog.csdnimg.cn/blog_migrate/a1cd461ac609ea28e0be79ec824d76b9.jpeg)
图1 二维滤波器的卷积运算示例
需要说明的是,这里我们所说的卷积实际上是互相关(cross-correlation)。两者的区别在于,卷积的计算需要将卷积核进行翻转(相当于旋转180度),互相关也可以理解为不对卷积核进行翻转的卷积。
这里不需要对卷积核进行翻转的原因是卷积核是否进行翻转并不影响神经网络对特征的抽取,另外卷积神经网络中的卷积核是需要学习的参数,因此卷积和互相关在这里其实是等价的。由于互相关的计算更加简便,所以目前我们在深度学习中都是使用互相关操作来替代卷积。
在图像处理中,卷积是用来做特征提取的一个有效方法。不同的卷积核可以用来检测图像中不同的特征,以手写数字识别为例,如图2左侧所示是一个手写数字"1",右侧是它的像素值。
![c6a35dc1189fed21ef54dded2e9e5e28.png](https://i-blog.csdnimg.cn/blog_migrate/1097f96a0e2e367b6bfbeab895bf13df.jpeg)
(左图:手写数字原始图像;右图:手写数字的像素值)
现在我们要用卷积操作来提取这个数字的特征,假设我们有如图3所示的两个卷积核。
![ab56fff48a8c1a3c529d0f8302b7352c.png](https://i-blog.csdnimg.cn/blog_migrate/52ecdceadd784695ed347c70bdd09978.jpeg)
图3用来识别手写数字的两个不同的卷积核a(左)和b(右)
如图4所示,当我们用卷积核a对原始图像做卷积操作时,根据前面介绍的卷积计算方式,其结果为:
![2183a368d464b8de7c7d9e59cb804428.png](https://i-blog.csdnimg.cn/blog_migrate/cac9c1f087708b5d4b3816d08330eb6a.jpeg)
![9c107bb308d98404e8df8d2733b12aca.png](https://i-blog.csdnimg.cn/blog_migrate/34998354f260c3e4f2e2c4971d2f35e9.jpeg)
图4使用卷积核a对原始图像做卷积操作 (左:原始图像的像素表示;右:卷积核a)
我们再换用卷积核b对原始图像进行卷积,如图5所示。
![8a8356238605c443eb51634db4b2c8ee.png](https://i-blog.csdnimg.cn/blog_migrate/7dd53c256e3178624ef9f8b0cbc6ba54.jpeg)
图5使用卷积核b对原始图像做卷积操作
卷积得到的结果为:
![b720bafd5d48aeaffaf2c269c9d11a84.png](https://i-blog.csdnimg.cn/blog_migrate/ad1640de41c5a88856be26f41527f70a.jpeg)
从计算结果来看,卷积核a与原始图像卷积计算得到的值要远大于卷积核b。通过观察也能发现,卷积核a的形状与原始图像的重合度较高,这也是卷积核提取图像特征的关键,如果图像的某一区域与卷积核所能检测的特征很相似,那么该区域就会激活卷积核,得到一个很高的值,反之,如果图像的某一区域与卷积核所能检测的特征不相似,卷积操作之后,该区域的值就会相对较低。
如图6所示是图像处理中常用的几种卷积核,图中最上面的卷积核是高斯卷积核,其作用是对图像进行平滑降噪处理,第二和第三个卷积核可以用来进行边缘检测。
![9115cd34cb6744b0664b0d2174903b56.png](https://i-blog.csdnimg.cn/blog_migrate/59c5db1a6a50f48683d085c6b5aa7aa3.jpeg)
图6图像处理中的几种滤波器示例(图片引用自:https://nndl.github.io/)
(图片引用自:https://nndl.github.io/)
现实中我们不可能针对每一种情况去设计一个卷积核,而卷积神经网络的强大就在于它可以学习到需要的卷积核,卷积神经网络通过从训练数据中学习到所需的卷积核,从而实现图像检测、分类的任务。
在卷积神经网络中,为了达到更灵活的特征抽取,我们引入了卷积核的滑动步长(Stride)和零填充(Zero-padding)来增加卷积的多样性。
卷积核的滑动步长是指卷积核在卷积操作中每次移动的距离,如图7的上半部分所示是滑动步长为1时候的情况。如果将滑动步长设为2,则卷积核每次在横向(或纵向)移动的距离就为2,如图4-7的下半部分所示。
![8c848a97f03ce66c6f40e40043173bc2.png](https://i-blog.csdnimg.cn/blog_migrate/f833dabb3fff21a6b1e68501c9e2d542.jpeg)
![97e4da0f6576472551ee287ee0e451e7.png](https://i-blog.csdnimg.cn/blog_migrate/05d4a690f98762e5966846c4ec8307a4.jpeg)
图7滑动步长分别为1(上)和2(下)的卷积过程示例
(本小节图片均引用自:Dumoulin V , Visin F .
A guide to convolution arithmetic for deep learning[J]. 2016.)
零填充是指在输入矩阵的四周填充零,如图8所示在输入矩阵的周围填充了宽度为2的零。
![7b13995962a74b67c0327447474fe863.png](https://i-blog.csdnimg.cn/blog_migrate/9678e5e136293218d575900b2eece8a6.jpeg)
图8宽度为2的零填充示例
在卷积神经网络中,按照不同的零填充的方式可以划分为不同的卷积,如下是三种较为常用的卷积(假设输入矩阵的大小为m*m,卷积核的大小为n*n,滑动步长为s,零填充的宽度为p。):
1)窄卷积(narrow convolution):图7上半部分所示的情况就是窄卷积,其中滑动步长s=1,不进行零填充,卷积后输出的特征图大小为(m-n+1)*(m-n+1)。
2)宽卷积(wide convolution):图9所示是宽卷积的示例,其中滑动步长s=1,零填充的宽度为p=n-1,卷积后输出的特征图大小为(m+n-1)*(m+n-1)。
3)等宽卷积(equal-width convolution):图10所示是等宽卷积的示例,其中滑动步长s=1,零填充的宽度为p=(n-1)/2,卷积后输出的特征图大小为m*m,等宽卷积得到的特征图和输入的原图大小一致。
![899492f068661fcd0286d0f4436ad4e3.png](https://i-blog.csdnimg.cn/blog_migrate/64cac04d81c60dae400bf0e2ed059649.jpeg)
图9宽卷积示例
![bb2edd243daad32cfd815a0594f084a2.png](https://i-blog.csdnimg.cn/blog_migrate/38049c6d0f00269249cd352b7c2a671a.jpeg)
图10等宽卷积示例
四、 总结
由于卷积神经网络内容篇幅较大,故在此将卷积神经网络内容拆分为三部分,首先本篇幅介绍了卷积神经网络的发展,卷积神经网络模型的特性以及卷积层的特点。下一部分将介绍卷积层的结构和池化层的结构。最后将结合代码以一个实际比赛冰山雷达波图像识别结尾。
五、 参考文献
[1]Alex Krizhevsky: ImageNet Classification with Deep Convolutional Neural Networks .NIPS 2012