一、LeNet模型简介
LeNet模型是一种用来识别手写数字的最经典的卷积神经网络,他是Yann LeCun在1998年设计并提出的。当年美国大多数银行就是用它来识别支票上面的手写数字的。它的识别准确性非常高。
LeNet的网络模型框架如下图所示:
下面对网络模型的每一层进行分析。
二、LeNet模型网络层详解
LeNet-5包含输入共有8层,每层都包含可训练参数(连接权重)。
第一层:输入层。输入图像的尺寸为32*32。这要比Mnist数据库(caffe中的输入尺寸为28*28)中最大的字母还大。这样做的原因是希望潜在的明显特征,比如笔画断续、角点能够出现在最高层特征监测子感受野的中心。
第二层:C1卷积层。它是第一个卷积层,它由6个特征图Feature Map构成,5*5大小的卷积核。而特征图中每个神经元与输入中5*5的邻域相连。特征图的大小为28*28(32-5+1=28),所以每个特征图上有28*28个神经元。C1有156个可训练参数(每个滤波器5*5=25个unit参数和一个bias参数,一共6个滤波器,共(5*5+1)*6=156个参数),共156(28*28)=122,304个连接。(最后顺便说一下为什么要进行卷积?卷积运算一个重要的特点就是,通过卷积运算,可以使原信号特征增强,并且降低噪音,同时不同的卷积层可以提取到图像中的不同特征,这层卷积我们就是用了6个卷积核)
第三层:S2层是一个下采样层,有6个14*14的特征图。特征图中的每个单元与C1中相对应特征图的2*2邻域相连接。S2层每个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置,结果通过sigmoid函数计算而得。每个单元的2*2感受野并不重叠,因此S2中每个特征图的大小是C1中特征图大小的1/4(行和列各1/2),所以S2中每一个特征图都有14*14个神经元。S2层有12个可训练参数(2*6=12,2代表一个可训练参数和一个可训练偏置)和5880个连接,计算过程如下:(4+1)*(14*14)*6=5880。(说明下为什么要进行下采样?利用图像局部相关性的原理,对图像进行子抽样,可以减少数据处理量同时保留有用信息,从而降低了网络训练的参数和模型的过拟合程度)。
一般神经网络常采用最大池化或平均池化。子采样具体过程如下:每邻域四个像素求和变为一个像素,然后通过标量Wx+1加权,再增加偏置bx+1,然后通过一个sigmoid激活函数,产生一个大概缩小四倍的特征映射图Sx+1。在整个网络中,S-层可看作是模糊滤波器,起到二次特征提取的作用。隐层与隐层之间空间分辨率递减,而每层所含的平面数递增,这样可用于检测更多的特征信息。
第四层:C3层是第二个卷积层。它同样通过5x5的卷积核去卷积层S2,然后得到的特征map就只有10x10个神经元,但是它有16种不同的卷积核,所以就存在16个特征map了。这里需要注意的一点是:C3中的每个特征map是连接到S2中的所有6个或者几个特征map的,表示本层的特征map是上一层提取到的特征map的不同组合(这里是组合,就像人的视觉系统一样,底层的结构构成上层更抽象的结构,例如边缘构成形状或者目标的部分)。
在Yann的论文中说明了C3中每个特征图与S2中哪些特征图相连,连接情况如下表所示:
由上表可以发现C3的前6个特征图以S2中3个相邻的特征图为输入。接下来6个特征图以S2中4个相邻特征图为输入,下面的3个特征图以不相邻的4个特征图为输入。最后一个特征图以S2中所有特征图为输入。这样C3层有1516个可训练参数((25*3+1)*6+(25*4+1)*9+(25*6+1)=1516)和151600(1516*10*10)个连接。
那么为什么不把S2中的每个特征图连接到每个C3的特征图呢?原因有2点。第一,不完全的连接机制将连接的数量保持在合理的范围内。第二,也是最重要的,其破坏了网络的对称性。由于不同的特征图有不同的输入,所以迫使他们抽取不同的特征(希望是互补的)。
第五层:S4层是一个下采样层,由16个5*5大小的特征图构成。特征图中的每个单元与C3中相应特征图的2*2邻域相连接,跟C1和S2之间的连接一样。S4层有32(2*16)个可训练参数(每个特征图1个因子和一个偏置)和2000个连接。
第六层:C5层是一个卷积层,有120个特征图。每个单元与S4层的全部16个特征图的5*5领域相连。由于S4层特征图的大小也为5*5(同滤波器一样),故C5特征图的大小为1*1,这构成了S4和C5之间的全连接。之所以仍将C5标示为卷积层而非全连接层,是因为如果LeNet-5的输入变大,而其他的保持不变,那么此时特征图的维数就会比1*1大。C5层有48120个可训练连接((5*5*16+1)*120)。
第七层:F6层有84个单元(之所以选这个数字的原因来自于输出层的设计),与C5层全相连。有10164个可训练参数((1*1*120+1)*84=10164)。如同经典神经网络,F6层计算输入向量和权重向量之间的点积,再加上一个偏置。然后将其传递给sigmoid函数产生单元i的一个状态。
第八层:输出层由欧式径向基函数(Euclidean Radial Basis Function)单元组成,每类一个单元,每个有84个输入。换句话说,每个输出RBF单元计算输入向量和参数向量之间的欧式距离。输入离参数向量越远,RBF输出的越大。一个RBF输出可以被理解为衡量输入模式和与RBF相关联类的一个模型的匹配程度的惩罚项。用概率术语来说,RBF输出可以被理解为F6层配置空间的高斯分布的负log-likelihood。给定一个输入模式,损失函数应能使得F6的配置与RBF参数向量(即模式的期望分类)足够接近。这些单元的参数是人工选取并保持固定的(至少初始时候如此)。这些参数向量的成分被设为-1或1。虽然这些参数可以以-1和1等概率的方式任选,或者构成一个纠错码,但是被设计成一个相应字符类的7*12大小(即84)的格式化图片。这种表示对识别单独的数字不是很有用,但是对识别可打印ASCII集中的字符串很有用。
使用这种分布编码而非更常用的“1 of N”编码用于产生输出的另一个原因是,当类别比较大的时候,非分布编码的效果比较差。原因是大多数时间非分布编码的输出必须为0。这使得用sigmoid单元很难实现。另一个原因是分类器不仅用于识别字母,也用于拒绝非字母。使用分布编码的RBF更适合该目标。因为与sigmoid不同,他们在输入空间的较好限制的区域内兴奋,而非典型模式更容易落到外边。
RBF参数向量起着F6层目标向量的角色。需要指出这些向量的成分是+1或-1,这正好在F6 sigmoid的范围内,因此可以防止sigmoid函数饱和。实际上,+1和-1是sigmoid函数的最大弯曲的点处。这使得F6单元运行在最大非线性范围内。必须避免sigmoid函数的饱和,因为这将会导致损失函数较慢的收敛和病态问题。