当前位置: 代码迷 >> 综合 >> 深度学习-网络模型【一】LeNet-5详解
  详细解决方案

深度学习-网络模型【一】LeNet-5详解

热度:99   发布时间:2023-12-18 21:14:09.0

论文: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

 

0、概述

LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,作者是Yann Lecun大神,相信搞深度学习的同学应该听说过他。

LeNet-5可以说是最最简单的一个卷积神经网络了,而且是一种用于手写体字符识别的非常高效的卷积神经网络,基本刚入门深度学习的同学应该先从这个网络模型看起,跑一跑MNIST手写体字符识别的数据集,体会一把卷积神经网络CNN的强大。

毫无疑问学习深度学习必须要学习CNN网络,学习CNN就必须明白卷积层、池化层等这些基础各层,以及它们的参数意义,因为CNN涉及的最核心的东西无非就是卷积层、池化层、全连接层等。

下面我们主要详细介绍一下卷积层和池化层,它们是CNN卷积神经网络的精髓所在,理解了它们的含义可以帮助我们理解LeNet-5。

 

1、卷积层(Convolution)

卷积层是卷积神经网络CNN的最最最核心的组成部件(从卷积神经网络这个名字就可以看出卷积操作在其中的分量了)。

在传统的图像处理里我们提到的卷积是二维卷积,即离散二维滤波器(也称作卷积核)与二维图像做卷积操作,简单的讲是二维滤波器滑动到二维图像上所有位置,并在每个位置上与该像素点及其领域像素点做内积。

卷积操作被广泛应用与图像处理领域,不同卷积核可以提取不同的特征,例如边沿、线性、角等特征。在深层卷积神经网络中,通过卷积操作可以提取出图像低级到复杂的特征。

对于给定的一幅图像来说,给定一个卷积核,卷积就是根据卷积窗口,进行像素的加权求和

记住下面几个符号,以后会经常看到:

  • H:图片高度;
  • W:图片宽度;
  • D:原始图片通道数,也是卷积核个数;
  • F:卷积核高宽大小;
  • P:图像边扩充方式('VALID'或者'SAME');
  • S:滑动步长。

 

下面具体看一个例子来了解这些参数具体是什么含义:

对于下图来说,蓝色大的矩形代表图像的像素,我们的卷积核就是在这个范围内进行左右的滑动,我们可以看到是5×5的size,因此:

  • H:图片高度=5
  • W:图片宽度=5

紫色小一点的矩形代表的就是上面所介绍的卷积核,卷积核就是在上述5×5的图像范围内进行滑动从而实现卷积操作,我们可以看到图中只包含了1个卷积核,而且是3×3的size,因此:

  • D:原始图片通道数,也是卷积核个数=1(channel=1)
  • F:卷积核高宽大小=3(filter size=3x3)

看图中最左上角的蓝色大矩形,一开始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',也就是不填充产生的特征图的边框,这时候由于卷积操作的影响,特征图的尺寸一定是比原图像的尺寸要小的,公式如下:

w_{out}=\frac{w_{in}-F+1}{S}

其中为输出特征图的大小,为输入的原图像大小,F为卷积核大小,S为滑动步长。不能整除时向上取整。

例如就拿上面我们计算过的例子,我们输入的原图像大小=5,卷积核大小F=3,滑动步长S=1,

所以w_{out}=\frac{w_{in}-F+1}{s}=\tfrac{5-3+1}{1}=3

刚好就是我们上面计算出来的特征图的尺寸大小

但是这样会有两个问题:

  • 每次卷积运算后,输出图片的尺寸缩小
  • 原始图片的角落、边缘区像素点在输出中采用较少,输出图片丢失边缘位置的很多信息

所以可以采用下面的方式

2.如果计算方式采用'SAME',这时候就表示我们填充产生的特征图的边框,这时候输出特征图的大小与输入原图的大小保持不变,公式如下:

P=\frac{F-1}{2}

其中P代表padding,也就是为特征图填充的圈数一圈包括左边、右边、上边、和下边均要填充一个像素值

例如我们之前对原图5×5进行3×3的卷积,S步长是1,最后得到的feature map的尺寸为3×3

如果采用'SAME'方式,需要填充的P=\frac{F-1}{2}=\frac{3-1}{2}=1,即左边、右边、上边、和下边均要填充一个像素值,所以看起来就是5×5,和原图大小是一样的!!

在计算机视觉领域,F也就是卷积核的尺寸通常取为奇数,如3×3、5×5、7×7等,其中很重要的原因就是'SAME'方法卷积后 P=\frac{F-1}{2} 能得到整数结果,而不是小数,并且卷积核有一个便于表示其所在位置的中心点

 

因此,对于下图:

  • P:图像边扩充方式=VALID(Padding=VALID),也就是不填充
  • S:滑动步长=1(strides=1),即每次向右或者向下只滑动一个像素值的位置

 

 

2、池化层(Pooling)

在卷积神经网络中,相邻的卷积层之间往往会加上一个池化层。

池化层可以非常有效地缩小参数矩阵的尺寸,从而减少最后全连层中的参数数量,既可以加快计算速度,也可以防止过拟合
在图像识别领域,有时图像太大,我们需要减少训练参数的数量,它被要求在随后的卷积层之间周期性地引进池化层。池化的唯一目的是减少图像的空间大小

常用的池化层有两种:最大池化层(max pooling) 以及 平均池化层(average pooling)

一般用的比较多的是最大池化层

最大池化层的效果如下图所示:

例如原图是4×4大小的,我们把整个图片分成4个小矩形,对每个小矩形进行最大值池化操作,其实很简单,就是取出每一个小矩形内所有元素中最大的那个元素

也可以看成是同样地采用一个2×2的卷积核,这里的stride=2,最大池化层是在每一个区域中寻找最大值,最终在原特征图中提取主要特征得到下右图所示

 

平均池化层现在不怎么用了,方法是对每一个2*2的区域元素求和,再除以4,得到主要特征,而一般的filter取2*2,最大取3*3,stride取2,压缩为原来的1/4.

池化是非线性下采样的一种形式,主要作用是通过减少网络的参数来减小计算量,并且能够在一定程度上控制过拟合。通常在卷积层的后面会加上一个池化层。池化包括最大池化、平均池化等。其中最大池化是用不重叠的矩形框将输入层分成不同的区域,对于每个矩形框的数取最大值作为输出层。

 

3、LeNet-5

了解完卷积层和池化层之后,我们终于可以进入到重点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)因此套用之前的公式w_{out}=\frac{w_{in}-F+1}{S},得到的输出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,因此套用之前的公式w_{out}=\frac{w_{in}-F+1}{S},得到的输出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有多个神经元。

 

 

4、总结

  • LeNet-5是一种用于手写体字符识别的非常高效的卷积神经网络。
  • 卷积神经网络能够很好的利用图像的结构信息。
  • 卷积层的参数较少,这也是由卷积层的主要特性即局部连接和共享权重所决定。