上图为LeNet-5识别手写体数字的过程,其包含输入层在内共有八层,每一层都包含多个参数(权重),c层代表的为卷积层,通过卷积操作,使原信号特征增强,并降低噪音。s层代表下采样层,即池化层,利用图像局部相关性的原理,对图像进行了子抽样,可以减少数据处理量,同时也可以保留一定的有用信息。
LeNet-5 包含了卷积神经网络的基本模块是入门卷积神经网络最好的网络之一,包含有卷积层,池化层,全链接层。
在此我会对LeNet5进行深入分析,进行模型解读。用来加深对与卷积层和池化层的理解。尤其是对其参数部分连接部分结构的理解。
LeNet模型解读
LeNet网络模型参数的具体结构如下:
1. 输入层
首先是数据输入层,输入图像的尺寸为32X32(Caffe中Mnist数据库为28X28)
注意:这样做的原因是希望潜在的明显特征,如笔画断续、角点能够出现在最高特征监测子感受野的中心。
2.C1层即卷积层
输入图片:32x32
卷积核大小:5x5
卷积核种类:6
输出featuremap大小:28*28 特征图计算为(32-5+1)=28((输入图像尺寸-卷积核尺寸+paddingx2)/stride步长)+1
神经元数量:28x28x6
可训练的参数:可训练参数即为从输入层至C1层之间添加得卷积层所需的参数为:(5x5+1) x 6(此处的每个filter5x5=25个参数和一个bias参数,一共6个filter)
连接数:(5x5+1)x6x28x28=122304(此处的训练后生成28x28的feature map,且权值共享,为CNN的特点,所以参数需要乘以28X28)
详细说明:对输入图像进行第一次卷积运算(使用 6 个大小为 5X5 的卷积核),得到6个C1特征图(6个大小为28x28的 feature maps, 32-5+1=28)。参数:卷积核的大小为5X5,总共就有(5x5+1) x 6=156个参数,其中+1是表示一个卷积核有一个bias。对于卷积层C1,C1内的每个像素都与输入图像中的5X5个像素和1个bias有连接,所以共有156x28x28=122304个连接。有122304个连接,但是只需要学习156个参数,主要是通过权值共享实现的。下图是神经元的传播方式
3、S2层-池化层(下采样层)
输入:28X28
采样区域:2X2
池化方式:此处池化为2X2得4,得到的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid得到的结果。一般采样为最大采样或平均采样。
采样种类:6
输出featureMap大小:14X14(28/2)
神经元数量:14X14X6
可训练的参数:2X6=12
连接数:(2X2+1)X6X14X14
S2中每个特征图的大小是C1中特征图大小的1/4。
详细说明:第一次卷积之后紧接着就是池化运算,使用 2X2核进行池化,于是得到了S2,6个14X14的特征图(28/2=14)。S2这个pooling层是对C1中的2X2区域内的像素求和乘以一个权值系数再加上一个偏置,因而可训练的参数为(1+1)X6=12,然后将这个结果再做一次映射。同时有(4+1)x14x14x6=5880个连接。此处4为卷积核的大小也就是2X2区域的连接,1为偏置值,14X14为经过操作后生成的196个像素点,共有6个特征图。
4、C3层-卷积层
输入:S2中所有6个或者几个特征map组合
卷积核大小:5x5
卷积核种类:16
输出featureMap大小:10x10 即(14-5+1)=10
神经元数量:10X10X16
可训练的参数:6x(3x5x5+1)+6x(4x5x5+1)+3x(4x5x5+1)+1x(6x5x5+1)=1516
连接数:10x10x1516=151600
C3中的每个特征map是连接到S2中的所有6个或者几个特征map的,表示本层的特征map是上一层提取到的特征map的不同组合
则:可训练参数:6x(3x5x5+1)+9x(4x5x5+1)+1x(6x5x5+1)=1516
连接数:10x10x1516=151600
S2 有6个14x14 的特征图,如何从6 个特征图得到 16个特征图了? 这里是通过对S2 的特征图特殊组合计算得到的16个特征图。具体如下:
存在的一个方式是:C3的前6个特征图以S2中3个相邻的特征图子集为输入。例其第0个特征图是由S2层的第0,1,2个特征图组合得到的,其所需训练的参数为3x5x5+1,共有六个这样的特征图:接下来6个特征图以S2中4个相邻特征图子集为输入,同理4个组合的有9个,所需训练的参数为9x(4x5x5+1)。最后一个将S2中所有特征图为输入,所需训练的参数为1x(6x5x5+1)。
C3与S2中前3个图相连的卷积结构如下图所示:
5、S4层-池化层(下采样层)
输入:10x10
采样区域:2x2
采样方式:4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid
采样种类:16
输出featureMap大小:5x5(10/2)
可训练的参数:(1+1)X16=32(1,同s2,为四个加起来乘的权重,1,为偏置)
神经元数量:5x5x16=400
连接数:16x(2x2+1)x5x5=2000
S4中每个特征图的大小是C3中特征图大小的1/4
S4是pooling层,窗口大小仍然是2x2,共计16个feature map,C3层的16个10x10的图分别进行以2x2为单位的池化得到16个5x5的特征图。有5x5x5x16=2000个连接。连接的方式与S2层类似。
6、C5层-卷积层
输入:S4层的全部16个单元特征map(与s4全相连)
卷积核大小:5x5
卷积核种类:120
输出featureMap大小:1x1即(5-5+1)所得
可训练参数:120x(16x5x5+1)=48120,此处的16同c3层的组合原理相同,在此处是将16个特征图组合得到的,1为偏置
连接数:120x(16x5x5+1)=48120
C5层是一个卷积层。由于S4层的16个图的大小为5x5,与卷积核的大小相同,所以卷积后形成的图的大小为1x1。这里形成120个卷积结果。每个都与上一层的16个图相连。所以共有(5x5x16+1)x120 = 48120个参数,同样有48120个连接。C5层的网络结构如下:
7、F6层-全连接层
输入:c5 120维向量
计算方式:计算输入向量和权重向量之间的点积,再加上一个偏置,结果通过sigmoid函数输出。
可训练参数:84x(1x1x120+1)=10164
详细说明:6层是全连接层。F6层有84个节点,对应于一个7x12的比特图,-1表示白色,1表示黑色,这样每个符号的比特图的黑白色就对应于一个编码。该层的训练参数和连接数是(120 + 1)x84=10164。ASCII编码图如下:
F6层的连接方式如下:
8、Output层-全连接层
Output层也是全连接层,共有10个节点,分别代表数字0到9,且如果节点i的值为0,则网络识别的结果是数字i。采用的是径向基函数(RBF)的网络连接方式。假设x是上一层的输入,y是RBF的输出,则RBF输出的计算方式是:
LeNet-5详解
上式w_ij 的值由i的比特图编码确定,i从0到9,j取值从0到7x12-1。RBF输出的值越接近于0,则越接近于i,即越接近于i的ASCII编码图,表示当前网络输入的识别结果是字符i。该层有84x10=840个参数和连接。
上图是LeNet-5识别数字3的过程。
LeNet可训练参数为:156+12+1516+32+48120+10164+840=60840,大概为六万的参数数量较小。
LeNet的pytorch网络结构的实现
参考资料:
参考《深度学习——Caffe之经典模型参数详解与实战》