论文:Gradient-Based Learning Applied to Document Recognition
论文链接:http://www.dengfanxin.cn/wp-content/uploads/2016/03/1998Lecun.pdf
代码链接:https://github.com/BVLC/caffe/blob/master/examples/mnist/lenet_train_test.prototxt
LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,作者是Yann Lecun大神,相信搞深度学习的同学应该听说过他。
LeNet-5可以说是最最简单的一个卷积神经网络了,而且是一种用于手写体字符识别的非常高效的卷积神经网络,基本刚入门深度学习的同学应该先从这个网络模型看起,跑一跑MNIST手写体字符识别的数据集,体会一把卷积神经网络CNN的强大。
毫无疑问学习深度学习必须要学习CNN网络,学习CNN就必须明白卷积层、池化层等这些基础各层,以及它们的参数意义,因为CNN涉及的最核心的东西无非就是卷积层、池化层、全连接层等。
下面我们主要详细介绍一下卷积层和池化层,它们是CNN卷积神经网络的精髓所在,理解了它们的含义可以帮助我们理解LeNet-5。
卷积层是卷积神经网络CNN的最最最核心的组成部件(从卷积神经网络这个名字就可以看出卷积操作在其中的分量了)。
在传统的图像处理里我们提到的卷积是二维卷积,即离散二维滤波器(也称作卷积核)与二维图像做卷积操作,简单的讲是二维滤波器滑动到二维图像上所有位置,并在每个位置上与该像素点及其领域像素点做内积。
卷积操作被广泛应用与图像处理领域,不同卷积核可以提取不同的特征,例如边沿、线性、角等特征。在深层卷积神经网络中,通过卷积操作可以提取出图像低级到复杂的特征。
对于给定的一幅图像来说,给定一个卷积核,卷积就是根据卷积窗口,进行像素的加权求和。
记住下面几个符号,以后会经常看到:
下面具体看一个例子来了解这些参数具体是什么含义:
对于下图来说,蓝色大的矩形代表图像的像素,我们的卷积核就是在这个范围内进行左右的滑动,我们可以看到是5×5的size,因此:
紫色小一点的矩形代表的就是上面所介绍的卷积核,卷积核就是在上述5×5的图像范围内进行滑动从而实现卷积操作,我们可以看到图中只包含了1个卷积核,而且是3×3的size,因此:
看图中最左上角的蓝色大矩形,一开始3×3的卷积核对齐5×5图像的左上角,每个小格子里看起来比较大的数字代表图像本身的像素值,在每个小格子里右下角那个看起来很小的数字代表卷积核的参数,我们需要做的,就是把对应的3×3的范围里的,每一个小格子里的大的数字和小的数字乘起来,最后把9个数字加起来,作为蓝色大矩形右边那个灰色小矩形的第一个小格子的值。
例如图中最左上角的蓝色大矩形:
3×0+3×1+2×2 + 0×2+0×2+1×0 + 3×0+1×1+2×2 = 0+3+4+0+0+0+0+1+4 = 12,刚好和右边那个灰色小矩形的第一个小格子的值相等
然后对于最上面那一行中间那副图,卷积核通通向右移动了一列,即滑动到了下一个窗口,不过操作还是一样的,每一个小格子里的大的数字和小的数字乘起来,然后进行像素的加权求和,得到灰色小矩形的第二个小格子的值
卷积核通过不断这样的滑动,不断计算灰色小矩形的不同位置小格子的值
如果右边已经不能再滑动了,我们就把卷积核回到最左边,然后通通向下滑动一行
直至右边和下边都不能再滑动了,这时候卷积核是到达了图像的最右下角,也就是下图的最后一行最后一列的图,计算完成后,我们就得到了灰色小矩形的最后一个位置小格子的值,这时候得到的灰色小矩形就是图像的特征图(feature map)
相信看下图的动画可以帮助大家更好地理解卷积操作:
还有一点要补充的就是如何计算特征图的尺寸呢?我们其实可以通过公式来计算:
卷积中的特征图大小计算方式有两种,
主要是和上面简单提到过的几个参数: P图像边扩充方式 、S:滑动步长 有关
1.如果P图像边扩充方式采用'VALID',也就是不填充产生的特征图的边框,这时候由于卷积操作的影响,特征图的尺寸一定是比原图像的尺寸要小的,公式如下:
其中为输出特征图的大小,为输入的原图像大小,F为卷积核大小,S为滑动步长。不能整除时向上取整。
例如就拿上面我们计算过的例子,我们输入的原图像大小=5,卷积核大小F=3,滑动步长S=1,
刚好就是我们上面计算出来的特征图的尺寸大小
但是这样会有两个问题:
所以可以采用下面的方式
2.如果计算方式采用'SAME',这时候就表示我们填充产生的特征图的边框,这时候输出特征图的大小与输入原图的大小保持不变,公式如下:
其中P代表padding,也就是为特征图填充的圈数(一圈包括左边、右边、上边、和下边均要填充一个像素值)
例如我们之前对原图5×5进行3×3的卷积,S步长是1,最后得到的feature map的尺寸为3×3
如果采用'SAME'方式,需要填充的,即左边、右边、上边、和下边均要填充一个像素值,所以看起来就是5×5,和原图大小是一样的!!
在计算机视觉领域,F也就是卷积核的尺寸通常取为奇数,如3×3、5×5、7×7等,其中很重要的原因就是'SAME'方法卷积后 能得到整数结果,而不是小数,并且卷积核有一个便于表示其所在位置的中心点。
因此,对于下图:
在卷积神经网络中,相邻的卷积层之间往往会加上一个池化层。
池化层可以非常有效地缩小参数矩阵的尺寸,从而减少最后全连层中的参数数量,既可以加快计算速度,也可以防止过拟合。
在图像识别领域,有时图像太大,我们需要减少训练参数的数量,它被要求在随后的卷积层之间周期性地引进池化层。池化的唯一目的是减少图像的空间大小。
常用的池化层有两种:最大池化层(max pooling) 以及 平均池化层(average pooling)
一般用的比较多的是最大池化层
最大池化层的效果如下图所示:
例如原图是4×4大小的,我们把整个图片分成4个小矩形,对每个小矩形进行最大值池化操作,其实很简单,就是取出每一个小矩形内所有元素中最大的那个元素。
也可以看成是同样地采用一个2×2的卷积核,这里的stride=2,最大池化层是在每一个区域中寻找最大值,最终在原特征图中提取主要特征得到下右图所示
平均池化层现在不怎么用了,方法是对每一个2*2的区域元素求和,再除以4,得到主要特征,而一般的filter取2*2,最大取3*3,stride取2,压缩为原来的1/4.
池化是非线性下采样的一种形式,主要作用是通过减少网络的参数来减小计算量,并且能够在一定程度上控制过拟合。通常在卷积层的后面会加上一个池化层。池化包括最大池化、平均池化等。其中最大池化是用不重叠的矩形框将输入层分成不同的区域,对于每个矩形框的数取最大值作为输出层。
了解完卷积层和池化层之后,我们终于可以进入到重点LeNet-5来了
LeNet-5应征了一句俗语,就是麻雀虽小,五脏俱全。这个网络虽然很小,但是它包含了卷积神经网络CNN的基本模块:卷积层,池化层,全连接层,理解它是理解其它更加复杂的CNN网络模型的基础, 这里我们对LeNet5进行分析,进而加深对上面介绍的卷积层和池化层的理解。
LeNet-5的输入和输出如下:
输入:size为32×32像素大小的手写体字符图片(这些手写体包含从0-9的数字,即一共有10个类别的图片)
输出:分类结果(即0-9之间的一个数)
LeNet-5的结构如上图所示,网络一共有7层(不包含输入层):
图中的Convolutions代表卷积、Subsampling代表降采样(也就是我们上面介绍的池化操作)、Full connection代表全连接层
0、输入层 INPUT:
输入二维图像,尺寸统一归一化为32×32
1、卷积层C1
该层的作用为提取特征,输入为上面的32×32的原始图像,卷积核size为5×5(整个lenet-5用到的卷积核尺寸均为5×5)因此套用之前的公式,得到的输出feature map大小为28×28 即(32-5+1)/ 1=28
卷积核个数也就是通道为6,即有6张feature map,每张feature map都是28×28,所以神经元数量为28×28×6
2、池化层S2
该层的作用为缩小矩阵的尺寸,减小计算量。输入为C1的输出28×28的feature map,通过最大值池化层操作,输出的feature map大小就是14×14(28/2),即减半了。
而池化不影响通道数,所以还是6,每张feature map都是14×14,神经元数量为14×14×6
3、卷积层C3
该层的作用还是提取特征,输入为S2的输出14×14的feature map,卷积核size为5×5,因此套用之前的公式,得到的输出feature map大小为28×28 即(14-5+1)/ 1=10
卷积核个数也就是通道为16,即有16张feature map,每张feature map都是10×10,所以神经元数量为10×10×16
4、卷积层S4
该层的作用为缩小矩阵的尺寸,减小计算量。输入为C3的输出10×10的feature map,通过最大值池化层操作,输出的feature map大小就是5×5(10/2),即减半了。
而池化不影响通道数,所以还是16,每张feature map都是5×5,神经元数量为5×5×16
5、卷积层C5(其实也可以理解成全连接层,因为这里5×5的输入,用5×5的卷积核做卷积,最后输出1×1)
该层的输入为S4层输出的全部16个5×5大小的feature map,每个feature map的大小都与上一层S4的所有feature maps进行连接,卷积核大小为5×5,卷积核个数为120,因此输出的feature map大小:1×1即(5-5+1)/ 1=1,所以神经元数量为1×1×120=120
feature map的大小为1×1,这样刚好变成了全连接,但是我们不把它写成F5,因为这只是巧合。
6、全连接层F6层
该层的输入为C5的120维向量
计算方式:计算输入向量和权重向量之间的点积,再加上一个偏置,结果通过sigmoid函数输出
F6层的连接方式如下:
F6层有84个输出节点
7、全连接层Output
Output层也是全连接层,共有10个节点,分别代表数字0到9
整个过程的feature map大致如下:
每层都包含可训练参数;每个层有多个feature map,每个feature map通过一种卷积滤波器提取输入的一种特征,然后每个feature map有多个神经元。