程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(2)

深度学习—卷积神经网络LeNet

发布于2021-05-30 19:26     阅读(888)     评论(0)     点赞(15)     收藏(1)



在这一讲中,我们将讲解目前深度学习领域最常用的一个模型—卷积神经网络( Convolutional Neural Network, CNN)。

1. CNN的历史

CNN的历史可以追溯到1980年Fukushima发明的神经认知机(neocognitron),这是第一个通过自动学习卷积核的人工神经网络系统,具备了CNN最基础的性质。在1998年,在贝尔实验室工作的Yann LeCun开发了一套能够识别手写数字的系统,即识别一张二值图片是0到9数字当中的哪一个。Yann LeCun以自己的名字命名了这个CNNLeNet,这是CNN第一次走入实际的应用领域,Yann LeCun的工作基本上定义了目前CNN当中常用的技术,包括自动学习卷积核、多层结构、降采样和全连接技术等等组成部分。

在这里插入图片描述

图1 Yann LeCun与LeNet结构

2. 卷积神经网络LeNet

2.1 经典的LeNet结构

下图2是经典的LeNet的结构,它包含7层,首先是一个输入层,输入一张32×32的二值图像,LeNet有2个卷积层,分别用C1C3表示,同时它有2个降采样层S2S4,最后它有2个全连接层C5F6,1个输出层。
在这里插入图片描述

图2 LeNet-5网络结构

2.2 卷积过程

首先,我们了解一下卷积的概念,如下图3(a)所示,假设输入是一张32×32的彩色图片,这张图片有RGB三个颜色的分量。在图中,我们可以把这张图片表示成一个长(height)、宽(width)都是32,而通道数channel3的一个张量(tensor)。我们将图像和一个卷积核(convolutional kernal)进行卷积运算,假设这个卷积核是另一个5×5×3的张量,如图3(b)所示,这个卷积核从左上到右下以步长stride=1进行滑动,每滑到一个位置,我们把卷积核与该位置图像重合的像素值相乘然后再相加得到一个数(如图3(b)示意图,仅示意非本例),将每次滑动的数排列起来将得到一个28×28×1的张量。我们把获得的这个28×28×1的张量叫作特征图(Feature Map),如图3(a)的右边所示,这就是一幅图像经过卷积核卷积运算的全过程。

在这里插入图片描述

图3(a) 卷积运算示意图

在这里插入图片描述

图3(b)卷积动态运算示意图(仅示意非本例)

在这个例子中,为什么获得的特征图长和宽都是28呢?

我们简要说一下其中的道理,我们先看特征图的长,特征图的第1个数是卷积核在最左上端的时候与图像相乘再相加的结果,由于卷积核的长是5,因此,这个时候它覆盖的图像长这个方向第1到第5个像素。接下来,特征图以步长stride=1向右移动了一个步数,那么此时卷积核覆盖的图像长这个方向第2到第6个像素,以此类推,卷积核不断向右移动,直到移动28次后,覆盖的图像长这个方向第28到第32个像素,此时,卷积核的最右边已经到达了图像的最右边,即图像的第32个像素,因此特征图的长就是28。同样的道理可以推出,特征图的宽也是28。卷积过程动态示意图如下图4所示(仅示意非本例)。

在这里插入图片描述

图4 卷积过程动态示意图(仅示意非本例)

3. LeNet-5网络结构分析

3.1 卷积核参数更新

LeNet中,第一层卷积层C1,我们用了6个卷积核卷积原来的图像,因此我们获得了6个28×28的特征图,用简化的画法可以看到,我们可以直接把这6个特征图并到一起作为最后的显示结果。由于这6个卷积核的参数是待定的,所以我们需要在训练过程中通过后向传播算法对他们进行更新

在这里插入图片描述

图5 LeNet第一层卷积简化

接下来,我们简要的讲一下如何求解卷积核中参数的梯度,从而完成对卷积核参数的更新,如下图6所示。

在这里插入图片描述

图6 二维卷积参数化示例

假设我们计算一个3×3的图像与一个2×2的卷积核卷积,stride=1,图像的像素值分别用x1x9表示,卷积核的参数分别用w1w4表示,最终我们得到的2×2的特征图,它的参数用p1p4表示。根据前面卷积操作的流程,我们可以把 p1p4 写成如下的形式:

在这里插入图片描述
写出来稍微有点复杂,但是在图6上利用卷积的性质我们很容易获得这些式子。以上这4个式子等价于如下权值共享网络。

在这里插入图片描述

图7 权值共享网络

在图7中,w1,w2,w3,w4各自被用了4次。因此我们假设整个LeNet最终的目标函数为 E E E,那么通过链式求导法则,我们可以很方便的得到 ∂ E ∂ w 1 , ∂ E ∂ w 2 , ∂ E ∂ w 3 , ∂ E ∂ w 4 \frac {∂E}{∂w_1},\frac {∂E}{∂w_2},\frac {∂E}{∂w_3},\frac {∂E}{∂w_4} w1E,w2E,w3E,w4E,如下式所示:

∂ E ∂ w 1 = ∂ E ∂ p 1 x 1 + ∂ E ∂ p 2 x 2 + ∂ E ∂ p 3 x 4 + ∂ E ∂ p 4 x 5 \frac {∂E}{∂w_1}=\frac {∂E}{∂p_1}x_1+\frac {∂E}{∂p_2}x_2+\frac {∂E}{∂p_3}x_4+\frac {∂E}{∂p_4}x_5 w1E=p1Ex1+p2Ex2+p3Ex4+p4Ex5

∂ E ∂ w 2 = ∂ E ∂ p 1 x 2 + ∂ E ∂ p 2 x 3 + ∂ E ∂ p 3 x 5 + ∂ E ∂ p 4 x 6 \frac {∂E}{∂w_2}=\frac {∂E}{∂p_1}x_2+\frac {∂E}{∂p_2}x_3+\frac {∂E}{∂p_3}x_5+\frac {∂E}{∂p_4}x_6 w2E=p1Ex2+p2Ex3+p3Ex5+p4Ex6

∂ E ∂ w 3 = ∂ E ∂ p 1 x 4 + ∂ E ∂ p 2 x 5 + ∂ E ∂ p 3 x 7 + ∂ E ∂ p 4 x 8 \frac {∂E}{∂w_3}=\frac {∂E}{∂p_1}x_4+\frac {∂E}{∂p_2}x_5+\frac {∂E}{∂p_3}x_7+\frac {∂E}{∂p_4}x_8 w3E=p1Ex4+p2Ex5+p3Ex7+p4Ex8

∂ E ∂ w 4 = ∂ E ∂ p 1 x 5 + ∂ E ∂ p 2 x 6 + ∂ E ∂ p 3 x 8 + ∂ E ∂ p 4 x 9 \frac {∂E}{∂w_4}=\frac {∂E}{∂p_1}x_5+\frac {∂E}{∂p_2}x_6+\frac {∂E}{∂p_3}x_8+\frac {∂E}{∂p_4}x_9 w4E=p1Ex5+p2Ex6+p3Ex8+p4Ex9

3.2 LeNet网络逐层分析

接下来,我们讲解卷积神经网络中的降采样层。如图2所示,经过卷积C1后,我们获得了6个28×28的特征图,然后我们把这些特征图通过降采样层S2获得6个14×14的特征图。在LeNet中,降采样层采用取平均值的方式,即把相邻四个像素的值取平均后获得,这种方式叫作平均降采样(Average Subsampling,下图8是降采样的示意图。

在这里插入图片描述

图8 平均降采样

左边所有红色区域内的像素值取平均过后获得右边一个浅蓝色像素的值。在LeNet中,我们以步长stride=(2,2)对原来的特征图进行降采样,将相邻的4个像素值取平均,这样我们可以把一个28*28的特征图变成14*14的特征图。

我们简要介绍一下如何对降采样层进行梯度的后向传播。在这里我们是对相邻4个像素值x1,x2,x3,x4取平均值,获得 Y = ( x 1 + x 2 + x 3 + x 4 ) / 4 Y=(x1+x2+x3+x4)/4 Y=(x1+x2+x3+x4)/4,则有
∂ E ∂ x 1 = ∂ E ∂ x 2 = ∂ E ∂ x 3 = ∂ E ∂ x 4 = 1 4 ∂ E ∂ y \frac {∂E}{∂x_1}=\frac {∂E}{∂x_2}=\frac {∂E}{∂x_3}=\frac {∂E}{∂x_4}=\frac14\frac {∂E}{∂y} x1E=x2E=x3E=x4E=41yE
这就是降采样层的后向梯度传导。

LeNet中,经过降采样层S2后,我们来到卷积层C3,这里我们再次用16个5×5的卷积核对生成的14×14×6的特征图进行卷积运算获得16个10×10的特征图,然后再次通过降采样层S4,仍然是步长stride=(2,2)的降采样获得16个5×5的特征图。接下来是全连接层,首先全连接层C5将16个5×5的特征图展开成400个像素作为一个整体的向量输入进全连接层。C5中有120个神经元,因此它的输出是一个120维度的向量,接下来另一个全连接层F6C5的输出进行操作,它有84个神经元,因此输出84个维度的向量。

LeNet的任务是识别手写体数字0-9,总共有10个类别,因此最后输出层是10个维度,输出层也是全连接层,这10个维度的输出用SoftMax+Cross Entropy的目标函数,这与前面讲过的完全一致了。

当然,需要强调的是在LeNet中,层与层之间都有非线性函数连接,在图中为了简略起见没有画出。我们可以采用SigmoidTanh作为连接层与层之间的非线性函数,另一方面在Yann LeCun最初的论文当中也不是完全采用这样的结构。由于当时的计算和存储资源有限,因此他使用了很多细节性的技巧来降低网络待估计的参数量,从而降低计算的复杂度。对于目前的计算资源来说我们已经不需要讨论类似的技巧了,因此在这里不在详细的叙述,大家感兴趣可以参阅Yann LeCun的论文

最后,对LeNet-5网络结构总结如下表1所示。

表1 LeNet-5网络结构参数

在这里插入图片描述

3.3 LeNet中待估计参数

为了加深对神经网络的理解,下面计算一下LeNet待估计的参数个数

第1层(convolutional layer,C1):由6个5×5的卷积核构成,总共待估计参数为 (5×5)×6=150

第2层(subsampling layer,S2): 降采样层没有待估计的参数,待估计参数为0

第3层(convolutional layer,C3): 由16个5×5×6的卷积核构成,总共待估计参数为(5×5×6)×16=2400

第4层(subsampling layer,S4): 降采样层没有待估计的参数,待估计参数为0

第5层(fully connected layer,C5): 输入的维度5×5×16共400个维度,输出有120个神经元,对于每一个神经元它都是有输入w(400个维度)和1个偏置b,所以总共待估计参数为(5×5×16+1)×120=48120。同理可得后面全连接层的参数个数。

第6层(fully connected layer,F6): (120+1)×84=10164

第7层(fully connected layer): (84+1)×10=850

将7层参数个数相加,可以得到LeNet中总共参数有61,684个待估计参数。

同时,Yann LeCun制作了Mnist数据集用来实现对LeNet这个卷积神经网络的训练,Mnist数据集包含了60000个训练样本,10000个测试样本。LeNetMnist数据集数据集上获得了98.5%的识别率。

4. 结尾

在本讲中,我们基于LeNet介绍了图像卷积的概念,卷积神经网络的结构以及卷积神经网络中后向传播算法梯度的计算等一系列问题。

最后,有两道思考题:

  1. 如果一个M×N的图像和一个m×n的卷积核进行操作,移动步长stride=(P,Q),即在长的方向上每步移动P个像素,在宽这个方向上每步移动Q个像素,请问经过卷积操作后获得的特征图的长和宽分别是多少呢?
  2. 关于补0(Padding)操作,我们经常对图像进行补0操作,例如如下图所示,当Padding=1时,我们在图像上下左右加一圈0;当Padding=2时,我们在图像上下左右加两圈0。

在这里插入图片描述
在这里插入图片描述
以此类推,请问对于一个32×32的图像,Padding=2,用一个5×5的卷积核进行卷积,stride=(1,1),基于以上的设置请问生成的特征图长和宽是多少呢?

如果文章对你有帮助,请记得点赞与关注,谢谢!
在这里插入图片描述
在这里插入图片描述

参考文献

  1. 浙江大学《机器学习》课程—胡浩基老师主讲
  2. LeCun Y., Bottou L., Bengio Y., and Haffner P., Gradient-based learning applied to document recognition, Proceedings of the IEEE, pp. 1-7, 1998.


所属网站分类: 技术文章 > 博客

作者:狗蛋你别跑

链接:http://www.phpheidong.com/blog/article/86851/76e6176cde20647d9f8a/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

15 0
收藏该文
已收藏

评论内容:(最多支持255个字符)