在这一讲中,我们将讲解目前深度学习领域最常用的一个模型—卷积神经网络(
Convolutional Neural Network, CNN
)。
1. CNN的历史
CNN
的历史可以追溯到1980年Fukushima
发明的神经认知机(neocognitron
),这是第一个通过自动学习卷积核的人工神经网络系统,具备了CNN
最基础的性质。在1998年,在贝尔实验室工作的Yann LeCun
开发了一套能够识别手写数字的系统,即识别一张二值图片是0到9数字当中的哪一个。Yann LeCun
以自己的名字命名了这个CNN
为LeNet
,这是CNN
第一次走入实际的应用领域,Yann LeCun
的工作基本上定义了目前CNN
当中常用的技术,包括自动学习卷积核、多层结构、降采样和全连接技术等等组成部分。
2. 卷积神经网络LeNet
2.1 经典的LeNet结构
下图2是经典的LeNet
的结构,它包含7
层,首先是一个输入层,输入一张32×32
的二值图像,LeNet
有2个卷积层,分别用C1
和C3
表示,同时它有2个降采样层S2
和S4
,最后它有2个全连接层C5
和F6
,1个输出层。
2.2 卷积过程
首先,我们了解一下卷积的概念,如下图3(a)所示,假设输入是一张32×32
的彩色图片,这张图片有RGB
三个颜色的分量。在图中,我们可以把这张图片表示成一个长(height
)、宽(width
)都是32
,而通道数channel
为3
的一个张量(tensor
)。我们将图像和一个卷积核(convolutional kernal
)进行卷积运算,假设这个卷积核是另一个5×5×3
的张量,如图3(b)所示,这个卷积核从左上到右下以步长stride=1
进行滑动,每滑到一个位置,我们把卷积核与该位置图像重合的像素值相乘然后再相加得到一个数(如图3(b)示意图,仅示意非本例),将每次滑动的数排列起来将得到一个28×28×1
的张量。我们把获得的这个28×28×1
的张量叫作特征图(Feature Map
),如图3(a)的右边所示,这就是一幅图像经过卷积核卷积运算的全过程。
在这个例子中,为什么获得的特征图长和宽都是28
呢?
我们简要说一下其中的道理,我们先看特征图的长,特征图的第1个数是卷积核在最左上端的时候与图像相乘再相加的结果,由于卷积核的长是5,因此,这个时候它覆盖的图像长这个方向第1到第5个像素。接下来,特征图以步长stride=1
向右移动了一个步数,那么此时卷积核覆盖的图像长这个方向第2到第6个像素,以此类推,卷积核不断向右移动,直到移动28次后,覆盖的图像长这个方向第28到第32个像素,此时,卷积核的最右边已经到达了图像的最右边,即图像的第32个像素,因此特征图的长就是28。同样的道理可以推出,特征图的宽也是28。卷积过程动态示意图如下图4所示(仅示意非本例)。
3. LeNet-5网络结构分析
3.1 卷积核参数更新
在LeNet
中,第一层卷积层C1
,我们用了6个卷积核卷积原来的图像,因此我们获得了6个28×28
的特征图,用简化的画法可以看到,我们可以直接把这6个特征图并到一起作为最后的显示结果。由于这6个卷积核的参数是待定的,所以我们需要在训练过程中通过后向传播算法对他们进行更新。
接下来,我们简要的讲一下如何求解卷积核中参数的梯度,从而完成对卷积核参数的更新,如下图6所示。
假设我们计算一个3×3
的图像与一个2×2
的卷积核卷积,stride=1
,图像的像素值分别用x1
到x9
表示,卷积核的参数分别用w1
到w4
表示,最终我们得到的2×2
的特征图,它的参数用p1
到p4
表示。根据前面卷积操作的流程,我们可以把 p1
到p4
写成如下的形式:
写出来稍微有点复杂,但是在图6上利用卷积的性质我们很容易获得这些式子。以上这4个式子等价于如下权值共享网络。
在图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} ∂w1∂E,∂w2∂E,∂w3∂E,∂w4∂E,如下式所示:
∂ 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 ∂w1∂E=∂p1∂Ex1+∂p2∂Ex2+∂p3∂Ex4+∂p4∂Ex5
∂ 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 ∂w2∂E=∂p1∂Ex2+∂p2∂Ex3+∂p3∂Ex5+∂p4∂Ex6
∂ 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 ∂w3∂E=∂p1∂Ex4+∂p2∂Ex5+∂p3∂Ex7+∂p4∂Ex8
∂ 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 ∂w4∂E=∂p1∂Ex5+∂p2∂Ex6+∂p3∂Ex8+∂p4∂Ex9
3.2 LeNet网络逐层分析
接下来,我们讲解卷积神经网络中的降采样层。如图2所示,经过卷积C1
后,我们获得了6个28×28
的特征图,然后我们把这些特征图通过降采样层S2
获得6个14×14
的特征图。在LeNet
中,降采样层采用取平均值的方式,即把相邻四个像素的值取平均后获得,这种方式叫作平均降采样(Average Subsampling
),下图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} ∂x1∂E=∂x2∂E=∂x3∂E=∂x4∂E=41∂y∂E
这就是降采样层的后向梯度传导。
在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维度的向量,接下来另一个全连接层F6
对C5
的输出进行操作,它有84个神经元,因此输出84个维度的向量。
LeNet
的任务是识别手写体数字0-9,总共有10个类别,因此最后输出层是10个维度,输出层也是全连接层,这10个维度的输出用SoftMax+Cross Entropy的目标函数,这与前面讲过的完全一致了。
当然,需要强调的是在LeNet
中,层与层之间都有非线性函数连接,在图中为了简略起见没有画出。我们可以采用Sigmoid
和Tanh
作为连接层与层之间的非线性函数,另一方面在Yann LeCun
最初的论文当中也不是完全采用这样的结构。由于当时的计算和存储资源有限,因此他使用了很多细节性的技巧来降低网络待估计的参数量,从而降低计算的复杂度。对于目前的计算资源来说我们已经不需要讨论类似的技巧了,因此在这里不在详细的叙述,大家感兴趣可以参阅Yann LeCun
的论文。
最后,对LeNet-5
网络结构总结如下表1所示。
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
个测试样本。LeNet
在Mnist
数据集数据集上获得了98.5%
的识别率。
4. 结尾
在本讲中,我们基于LeNet
介绍了图像卷积的概念,卷积神经网络的结构以及卷积神经网络中后向传播算法梯度的计算等一系列问题。
最后,有两道思考题:
- 如果一个
M×N
的图像和一个m×n
的卷积核进行操作,移动步长stride=(P,Q)
,即在长的方向上每步移动P
个像素,在宽这个方向上每步移动Q
个像素,请问经过卷积操作后获得的特征图的长和宽分别是多少呢? - 关于补0(
Padding
)操作,我们经常对图像进行补0操作,例如如下图所示,当Padding=1
时,我们在图像上下左右加一圈0;当Padding=2
时,我们在图像上下左右加两圈0。
以此类推,请问对于一个32×32
的图像,Padding=2
,用一个5×5
的卷积核进行卷积,stride=(1,1)
,基于以上的设置请问生成的特征图长和宽是多少呢?
如果文章对你有帮助,请记得点赞与关注,谢谢!
参考文献
- 浙江大学《机器学习》课程—胡浩基老师主讲
- LeCun Y., Bottou L., Bengio Y., and Haffner P., Gradient-based learning applied to document recognition, Proceedings of the IEEE, pp. 1-7, 1998.
转载:https://blog.csdn.net/DIPDWC/article/details/117249500