LeNet-5简介

LeNet-5是1998年LeCun发表的用于手写字符识别的经典卷积神经网络模型。当年美国很多银行就采用了这种模型来识别支票上的手写数字,能够达到如此高的商业程度,可见其识别精准和在深度学习发展史上的重要地位。

LeNet-5在论文中被用于识别MNIST数据集提供的0~9共10个手写数字。MNIST是当时Google实验室的Corinna Cortes和纽约大学柯朗研究所的Yann LeCun共同建立的手写数字数据库,包含训练集60000张即测试集10000张手写数字图片。该数据集提供的图片尺寸统一为LeNet-5 - 图1,图中包含字符的最大尺寸为LeNet-5 - 图2

231n中对LeNet的评价:

LeNet. The first successful applications of Convolutional Networks were developed by Yann LeCun in 1990’s. Of these, the best known is the LeNet architecture that was used to read zip codes, digits, etc.

LeNet-5详解

LeNet-5网络除输入层外包含7层,每层都含有可学习的参数。如下图所示,卷积层标记为LeNet-5 - 图3,下采样层标记为LeNet-5 - 图4,全连接层标记为LeNet-5 - 图5,其中LeNet-5 - 图6表示层下标(这个下标是指的在网络中的顺序,不是第几个这样的层)。

LeNet-5.png

输入:LeNet-5 - 图8的手写字体图片,这些手写字体包含0~9数字,也就是相当于10个类别的图片。网络输入是LeNet-5 - 图9像素的图片,这一尺寸明显大于MNIST提供的字符尺度(LeNet-5 - 图10)。这样设计的原因是希望如笔画末端或尖端等潜在的有效特征能够出现在最高层特征检测子感受野的中心位置,换句话说,网络高层的各个特征都集成了笔画和尖角边缘信息。在LeNet-5中,最后一个卷积层(LeNet-5 - 图11)的所有感受野中心会在输入的LeNet-5 - 图12像素LeNet-5 - 图13像素图片中形成一个LeNet-5 - 图14的区域。此外,还需对输入像素的取值进行标准化:白色背景取值LeNet-5 - 图15,黑色前景取值LeNet-5 - 图16,这样使得在MNIST数据集上像素点取值均值近似为LeNet-5 - 图17,方差近似为LeNet-5 - 图18。数据标准化能够有效地加速训练过程。

输出:分类结果,0~9之间的一个数。因此我们可以知道,这是一个多分类问题,总共有十个类,因此神经网络的最后输出层必然是SoftMax问题,然后神经元的个数是10个。

输入层

输入层:LeNet-5 - 图19的图片(因为是灰度图,所以其实是LeNet-5 - 图20),也就是相当于1024个神经元。

第一层(卷积)

LeNet-5 - 图21层:是网络的第一个卷积层,paper这里选择6个卷积核,卷积核大小选择LeNet-5 - 图22,这样我们可以得到6个特征图,每个特征图大小为LeNet-5 - 图23LeNet-5 - 图24),也就是神经元的个数为LeNet-5 - 图25。所以现在我们的维度从LeNet-5 - 图26变成了LeNet-5 - 图27

第一层.jpg

第二层(下采样)

LeNet-5 - 图29层:是下采样层,也就数使用最大池化进行下采样,池化的大小选择(2,2),也就相当于对LeNet-5 - 图30LeNet-5 - 图31的图片,进行分块(即邻域),每个块的大小为LeNet-5 - 图32,这样我们可以得到LeNet-5 - 图33个块,我们统计每个块中最大的值作为下采样的新像素,因此我们可以得到LeNet-5 - 图34大小的图片,共有6个这样的图片。至此我们的维度从LeNet-5 - 图35变成了LeNet-5 - 图36。在最初的论文中,会将邻域里的4个值求和乘系数并加上一个偏置,所得结果再通过Sigmoid激活函数来产生LeNet-5 - 图37层的特征图。这里系数和偏置是本层需要学习的参数。在后来的实现中,常用最大池化取代上述过程。

第二层.jpg

第三层(卷积-关键)

LeNet-5 - 图39层:同样是卷积层,这一层卷积核大小仍未LeNet-5 - 图40,据此我们可以得到新的图片大小为LeNet-5 - 图41LeNet-5 - 图42),然后我们希望可以得到16张特征图,即我们的维度从LeNet-5 - 图43变成LeNet-5 - 图44

第三层.jpg

那么问题来了,这一层是最难理解的,我们知道LeNet-5 - 图46包含:6张LeNet-5 - 图47大小的图片,我们希望这一层得到的结果是:16张LeNet-5 - 图48的图片。这16张图片的每一张,是通过LeNet-5 - 图49的6张图片进行加权组合得到的,具体怎么组合如下面所示:

第三层1.png

前6个特征图与LeNet-5 - 图51层相连的3个特征图相连接,后面6个特征图与LeNet-5 - 图52层相连的4个特征图相连接,后面3个特征图与LeNet-5 - 图53层部分不相连的4个特征图相连接,最后一个与LeNet-5 - 图54层的所有特征图相连。卷积核大小仍然为LeNet-5 - 图55,所以共有 个参数,而不是LeNet-5 - 图56个参数,而不是LeNet-5 - 图57个参数。因为图像大小是LeNet-5 - 图58,所以共有LeNet-5 - 图59个连接而不是LeNet-5 - 图60个。每个LeNet-5 - 图61层的特征图只与部分LeNet-5 - 图62层的特征图进行连接,这样做有两个原因:

  • 部分不完全的连接能够将连接数控制在一个比较合理的范围内。
  • 更重要的是,它强制地打破了网络的对称性,不同的特征图由于输入不同而能够表达出不同的特征。

第四层(下采样)

LeNet-5 - 图63层:也是下采样层,采用同样的下采样方式,得到16个LeNet-5 - 图64的特征图。我们的维度从LeNet-5 - 图65变成LeNet-5 - 图66

第四层.jpg

第五层(卷积)

LeNet-5 - 图68层:这一层是网络最后一个卷积层,具有120个特征图,每个特征图与LeNet-5 - 图69层所有的特征图相连接,卷积核大小是LeNet-5 - 图70,而LeNet-5 - 图71层的特征图大小也是LeNet-5 - 图72,所以LeNet-5 - 图73层的特征图就变成了LeNet-5 - 图74大小的特征图。即维度从LeNet-5 - 图75变成LeNet-5 - 图76。共有LeNet-5 - 图77个参数。

第五层.jpg

当特征图尺寸为LeNet-5 - 图79时,LeNet-5 - 图80层等价于一个全连接层。但我们仍以卷积层来命名它,因为当输入图片尺寸增大时,网络结构不发生变化。

第六层(全连接)

LeNet-5 - 图81层是与LeNet-5 - 图82层相连,包含84个单元的全连接层,即有LeNet-5 - 图83个参数 。这一层采用了正切函数,即LeNet-5 - 图84

第六层.jpg

输出层

最后,输出层由每个类别对应一个欧几里得RBF(Euclidean Radial Basis Function)单元构成。每个RBF单元的输入均为LeNet-5 - 图86层的84个输出,输出计算公式如下:

LeNet-5 - 图87

换言之,每个RBF单元计算的输入向量LeNet-5 - 图88和参数向量LeNet-5 - 图89之间的欧式距离,输入向量与参数向量之间的距离越远,RBF单元的输出越大。对于一个特定的RBF单元,其输出可以理解成衡量输入向量和对应类别之间匹配程度的一个惩罚项。从概率的观点看,RBF核的输出也可以理解成在由LeNet-5 - 图90层定义的高斯分布下一个未经归一化的负对数似然。由此,给定一个输入,损失函数将定义为使得LeNet-5 - 图91层输出尽量接近期望类别的RBF参数向量。采用这种方式,RBF单元的参数向量需要手动给出,并保持固定(至少在初始的时候),参数向量的每个元素取-1或1。

事实上,在以后的实践中,RBF单元常常被Softmax所取代。

输出层.jpg

Code实现

  1. def LeNet():
  2. model = Sequential()
  3. model.add(Conv2D(32,(5,5),strides=(1,1),input_shape=(28,28,1),padding='valid',activation='relu',kernel_initializer='uniform'))
  4. model.add(MaxPooling2D(pool_size=(2,2)))
  5. model.add(Conv2D(64,(5,5),strides=(1,1),padding='valid',activation='relu',kernel_initializer='uniform'))
  6. model.add(MaxPooling2D(pool_size=(2,2)))
  7. model.add(Flatten())
  8. model.add(Dense(100,activation='relu'))
  9. model.add(Dense(10,activation='softmax'))
  10. return model

Source

https://engmrk.com/lenet-5-a-classic-cnn-architecture/
https://blog.csdn.net/xuanyuansen/article/details/41800721
http://cs231n.github.io/convolutional-networks/#case
https://www.cnblogs.com/skyfsm/p/8451834.html