经典CNN模型LeNet

CNN经典网络LeNet-5,我们通常说的LeNet就是指LeNet-5。网络结构如下图,由LeCun在1998年的大作[2]中提出,本文尝试对此网络进行分析。

上述是LeNet-5的网络结构,整体上是input layer->convulational layer->pooling layer->activation function->convulational layer->pooling layer->activation function->convulational layer->fully connect layer->fully connect layer->output layer.

1. input层

输入为 32*32 pixel的图像。

2. C1层

2.1 C1层为卷积层,kernel size = 5 * 5,步长为1,无填充,生成6个feature map,换做现在的话来讲,叫做depth为6。
2.2 无填充,所以生成的feature map的长和宽都减去4(5-1得到),最终得到的feature map为28*28。
2.3 参数个数为(5*5+1)*6 = 156。其中5*5对应kernel size,1对应为bias,6是feature map的个数。
2.4 连接数 156*28*28 = 122304。156位参数个数,其中feature map上每个像素点对应5*5+1=26个连接,但是如果将深度为6的6个像素点作为一个的话,这一个对应的连接数为(5*5+1
)*6 = 156个。

3. S2层

3.1 S2层为降采样层,kernel size为2*2,长和宽的步长都为2,无填充。
3.2 S2层其实相当于降采样层+激活层。先是降采样,然后激活函数sigmoid非线性输出。
3.3 新生成的feature map大小为(28/2)*(28/2) = 14*14。
3.4 LeNet-5中,先对2*2的视野进行平均,然后进入激活函数。就是sigmoid(a*sigmoid(x)+b),的方法。所以参数的个数为 6*(1+1) = 12。
3.5 连接个数为12*14*14=5880。同2.4的算法,每个像素点(此处使用6个feature map的对应的6个像素点作为一个像素点)对应12个连接,所以feature map的连接数那么算了。当然,也可以使用6*14*14*(2*2+1) = 5880,可能更容易理解一些。

4. C3层

4.1 C3层为卷积层,kernel size为5*5,步长为1,生成16个feature map。C3的feature map并不是由全部S1的feature map生成的,对应的关系如下图图2。
4.2 并没有全部连接的原因:a. 控制参数个数 b.打破对称性,期望学到互补的特征。
4.3 同前方的计算方法,新得到的feature map大小为14-(5-1) = 10,即10*10。
4.4 参数个数 (5*5*3+1)*6+(5*5*4+1)*9+(5*5*6+1)=1516个。括号内部为kernel_size * kernel_size * feature_map_num + bias_num,表示从feature_map_size卷积得到的feature map所需要的参数个数;括号外为相应得到feature map的数目。
4.5 连接的个数是1516*10*10=151,600。10*10为新feature map的大小,feature map上的每个点(此处的点对应的16个像素点)都对应着1516个连接。

5. S4层

5.1 S4层为降采样层,此层配置如同S2层。kernel size为2*2,长和宽的步长均为2,无填充(本网络一直都是无填充)。
5.2 新生成的feature map为5*5,depth为16。
5.3 参数个数为16*2 = 32。
5.4 连接个数为5*5*16*(2*2+1) = 2000。其中,2*2为feature map的数目,1位bias。

6. C5层

6.1 C5为卷积层,kernel size为5*5,步长为1,无填充。全连接生成120个feature map。
6.2 C5层可以理解为两层,第一层是卷积层,经过5*5的卷积,从depth16,5*5的feature map变为depth为16,大小为1*1的feature map,其实就是16个点。第二层就是全连接层,16个点与120个点全连接。
6.3 参数个数 120*(5*5+1)=48120。惯例,1位偏置bias。
6.4 连接个数等于48120*1 = 48120。

7. F6层

7.1 F6层为全连接层,就很简单了,具体的内容如果不懂可以学习多层感知机(MLP)
7.2 参数个数=连接个数=(120+1)*84 = 10164。

8. output层

8.1 从F6层到output层,使用的公式(1)。
8.2 连接数84*10 = 840。
8.3 目前主流的都会使用softmax了,不使用这种方式了。

$$
\begin{equation}
{y_j} = \sum_{j} {x_j - w_{ij}}
\end{equation} \tag{1}
$$

9. 实现效果

最终网络的实现效果展示如下:

10. 简单评价

10.1 跟当前常用的cnn结构已经基本一致了。目前的cnn一般是[CONV - RELU - POOL],这里的[CONV - POOL - RELU],不过基本没什么影响。文章的激活函数是sigmoid,目前图像一般用tanh,relu,leakly relu较多,实践证明,一般比sigmoid好。后面一般接全连接层FC,这里也是一致的。
10.2 目前,多分类最后一层一般用softmax,文中的与此不太相同。

参考资料

  1. http://yann.lecun.com/exdb/lenet/
  2. LeCun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11): 2278-2324.
  3. LeCun Y, Boser B, Denker J S, et al. Backpropagation applied to handwritten zip code recognition[J]. Neural computation, 1989, 1(4): 541-551.
  4. https://blog.csdn.net/silent56_th/article/details/53456522
谢谢你,可爱的朋友。