LeNet-5 ,用于实现手写识别的7层CNN(不包含输入层),以下为LeNet-5的示意图:
输入原始图像的大小是32×32,卷积层用 Cx 表示,子采样层(pooling)用Sx表示,全连接层用Fx表示,x 代表层数。
C1层是Conv层,单通道下用了6个filter,这样就得到了6个feature map,其中每个卷积核的大小为5*5(因为是单通道,所以就一层),用每个卷积核与原始的输入图像进行卷积,这样每个filter对应的feature map的大小为(32-5+1)×(32-5+1)= 28×28,所需要的参数的个数为(5×5+1)×6= 156(其中5×5为卷积模板参数,1为偏置参数),连接数为(5×5+1)×28×28×6=122304(其中28×28为卷积后图像的大小)。
S2层为 pooling 层,也可以说是池化或者特征映射的过程。6个 feature map,每个feature map的大小为1414,每个feature map的隐单元与上一层C1相对应的feature map的 2×2 单元相连接,这里没有重叠。计算过程是:2×2 单元里的值相加然后再乘以训练参数w,再加上一个偏置参数b(每一个feature map共享相同w和b),然后取sigmoid (S函数:0-1区间)值,作为对应的该单元的值。(和max-polling,average-pooling有点区别)所以S2层中每 feature map 的长宽都是上一层C1的一半。S2层需要2×6=12个参数,连接数为(4+1)×14×14×6 = 5880。注:这里池化的过程与ufldl教程中略有不同。下面为卷积操作与池化的示意图:
C3层也是一个Conv层(14个通道),16核卷积,注意此处C3并不是与S2全连接而是部分连接,见下图),有16个卷积核,卷积模板的大小为55,因此具有16个feature maps,每个feature map的大小为(14-5+1)×(14-5+1)= 10×10。每个feature map只与上一层S2中部分feature maps相连接,下表给出了16个feature maps与上一层S2的连接方式(行为S2层feature map的标号,列为C3层feature map的标号,第一列表示C3层的第0个feature map只有S2层的第0、1和2这三个feature maps相连接,其它解释类似)。为什么要采用部分连接,而不采用全连接呢?首先就是部分连接,可计算的参数就会比较少,其次更重要的是它能打破对称性,这样就能得到输入的不同特征集合。以第0个feature map描述计算过程:用1个卷积核(对应3个卷积模板,但仍称为一个卷积核,可以认为是三维卷积核)分别与S2层的3个feature maps进行卷积,然后将卷积的结果相加,再加上一个偏置,再取sigmoid就可以得出对应的feature map了。所需要的参数数目为(5×5×3+1)×6 +(5×5×4+1)×9 +5×5×6+1 = 1516(5×5为卷积参数,卷积核分别有 3 4 6 个卷积模板),连接数为151610*10= 151600。
S4层也是采样层,有16个feature maps,每个feature map的大小为5×5,计算过程和S2类似,需要参数个数为16×2 = 32个,连接数为(4+1)×5×5×16 = 2000.
C5为卷积层,有120个卷积核,卷积核的大小仍然为5×5,因此有120个feature maps,每个feature map的大小都与上一层S4的所有feature maps进行连接,这样一个卷积核就有16个卷积模板。Feature map的大小为1×1,这样刚好变成了全连接,但是我们不把它写成F5,因为这只是巧合。C5层有120(5516+1) = 48120(16为上一层所有的feature maps个数)参数(自己的理解:和C3的不同,这一层一共有120个16维的55大小的卷积核,且每一个核中的16维模板都一样),连接数也是这么多。
F6层有86个神经单元,每个神经单元与C5进行全连接。它的连接数和参数均为 86 × 120 = 10164 。这样F6层就可以得到一个86维特征了。后面可以使用该86维特征进行做分类预测等内容了。注意:这里卷积和池化的计算过程和ufldl教程中的计算略有不同。