论文原文:Gradient-Based Learning Applied to Document Recognition
LeNet的整体结构
- 0. Input
- 1. C1:input_size = 32×32 ,output_size = 6@28×28
- 2. S2:input_size = 6@28×28 ,output_size = 6@14×14
- 3. C3:input_size = 6@14×14,output_size = 16@10×10
- 4. S4:input_size = 16@10×10 ,output_size = 16@5×5
- 5. C5:input_size = 16@5×5 ,output_size = 120@1×1
- 6. F6:input_size = 120 ,output_size = 84
- 7. OUTPUT:input_size = 84 ,output_size = 10
Fig 1展示的是LeNet的整体结构:
LeNet包括7个layers(不包括Input),Fig 1中的C、S和F分别指卷积层、下采样层(池化层)和全连接层,其后所跟随的数字1-6指所在层的索引位置。例如,S2意为在网络结构中索引为2的位置的下采样层。
0. Input
LeNet是设计用于识别手写数字,其Input为32×32的灰度图像(即通道数channels为1),可视作一个二维的matrix。如有兴趣,也可以自行将Input改为彩色图像,只需在LeNet代码中将channels改为3即可,此时是一个三维的tensor。
1. C1:input_size = 32×32 ,output_size = 6@28×28
C1层存在6个卷积核,卷积核大小为5×5,步长stride=1。
Fig 1中展示了经过C1层输出的feature map(特征图)为6@28×28,意为经C1层输出6个28×28大小的特征图。
2. S2:input_size = 6@28×28 ,output_size = 6@14×14
S2层为下采样层(也可称为池化层),这里使用的不是Max Pooling(很多文章将此处写为Max Pooling,可参见原文的叙述Fig 2),其实比较类似Average Pooling。
池化层大小为2×2,该2×2区域内的元素加总后乘以一个系数,再加上一个偏置后,送入Sigmoid激活函数,得到的值即为该2×2区域Subsampling后的值,因此经过S2层后,特征图大小的尺寸缩小一半,即为6@14×14(池化不改变通道数)。
ps. 由于原论文篇幅过长(46页),我没有找到这个trainable coefficient和trainable bias的值具体取了多少,所以我说的是S2层的操作类似于平均池化。
3. C3:input_size = 6@14×14,output_size = 16@10×10
C3层为16个5×5大小的卷积核(步长依旧为1),但是卷积时并没有一次性使用S2输出的6个特征图,而是对6个特征图进行了组合使用,组合方式见Fig 3。
例如,经C3层输出的第0个特征图,是由S2输出的6个特征图中的第0、1和2个特征图卷积得到的;经C3层输出的第1个特征图,是由S2输出的6个特征图中的第1、2和3个特征图卷积得到的,依次类推······
为什么要对S2输出的特征图进行组合使用?——对不同的卷积核给予不同的输入,可以增强而后输出的特征图间的互补性,也就是让C3输出的特征图语义能够各有含义又相互补充。
4. S4:input_size = 16@10×10 ,output_size = 16@5×5
S4层池化层大小为2×2,池化过程同S2层。
5. C5:input_size = 16@5×5 ,output_size = 120@1×1
C5层的卷积核数目为120,大小同C3层(为5×5),但卷积操作不同于C3,C5层卷积时同时使用了S4输出的16个特征图。
那么,你可能会有疑惑——卷积核大小和input进来的特征图大小一样,这不就等价于全连接操作吗?那为什么要叫卷积层?
确实,在这里看来,C5的操作就是全连接操作。那么,为什么还要叫其卷积层呢?原因在于如果此时网络的输入图像input要比32×32大的话,S4层得到的特征图就不是5×5大小,自然C5层输出的特征图也不再是1×1大小了,可能是2×2大小、3×3大小······那么,此时自然不可称其为全连接层。
6. F6:input_size = 120 ,output_size = 84
F6层是全连接层,用84个神经元去进行全连接操作,得到size为84的vector。
7. OUTPUT:input_size = 84 ,output_size = 10
OUTPUT层,即输出层,经由RBF函数输出分类结果(手写数字为0-9,共10个数字,所以最后输出的类别数目是10),RBF函数输出的值越大,表示input是该类别的可能性越小。也就是说,input经LeNet分类后,得到的分类结果是RBF函数最小输出值所对应的类别(这和Softmax正好相反)。
- RBF函数:
y i = ∑ j ( x j − w i j ) 2 y_i=\sum\limits_{j}(x_j-w_{ij})^2 yi=j∑(xj−wij)2
以上就是LeNet的核心内容,更细节的知识可点击文章顶部的原论文链接作进一步了解。