由于卷积神经网络结构较为复杂,因此以示例详解卷积神经网络。 作为手写数字识别的巅峰之作, Yann LeCun等人提出了基于卷积神经网络的一个文字识别系统 LeNet-5。(论文为《Gradient-Based Learning Applied to Document Recognition》)该系统90年代就被用于银行手写数字的识别,且识别率极高。 论文链接如下: 百度学术链接:https://xueshu.baidu.com/usercenter/paper/show?paperid=80fd293244903d8233327d0e5ba6de62&site=xueshu_se 或 https://download.csdn.net/download/didi_ya/12314987 下面详细解释一下上面这个用于文字识别的LeNet-5深层卷积网络,依次深入了解一下卷积神经网络。
首先,输入图片有一个要求,包含数字的部分必须在32*32中间部分,在边缘要留下一定区域的空白地带。The values of the input pixels are normalized so that the background level (white) corresponds to a value of 0.1 and the foreground (black) corresponds to 1.175. 即将输入像素的值进行标准化,使背景级别(白色)对应于0.1的值,而前景(黑色)对应于1.175。原因:所有像素相加平均值为0.
2.卷积层(C1)6@28X28该卷积层内有6个卷积平面,对应于6个5*5窗口(卷积核又叫filter或neuron),其运算过程如下图所示。
即有B11=A00K22+A01K21+A10K12+A11K11
同理: B12=A01K22+A02K21+A11K12+A12K11 B13=A02K22+A03K21+A12K12+A13K11 B14=A03K22+A04K21+A13K12+A14K11 。。。。。。 输入的32X32图像与5X5filter运算后,得到28X28矩阵(32-5+1=28)。 C1层中每个平面内的权值(5X5=25)是相同的,这称为权值共享。
因此,INPUT——C1层共有5X5X6=150个权值(一个filter有25个权值),还有6个偏置,因此共有156个需要训练的参数。(5X5+1)为一个神经元(一个5X5filter)产生的连接数,每张平面有28X28个神经元(filter),由于有6张平面,因此共有(5X5+1)X28X28X6=122304个连接数。
采样pooling有两种,取平均值Average pooling和取最大值Max pooling。Max pooling如下图所示:
由4个点(2X2filter)采样,乘权值再加偏置,得到一个采样层的值。一层中,所乘的权值和所加的偏置值都是相同的,因此一层中只有2个需要训练的参数。因此共有2X6=12个需要训练的参数。共有(2X2+1)X14X14X6=5880个连接数。
根据对前面C1层同样的理解,且同样利用5X5filter,我们很容易得到C3层的大小为10x10(14-5+1). 只不过,C3层的变成了16个10x10网络! 为什么呢?具体的组合规则,在 LeNet-5 系统中给出了下面的表格: 以C3层的第0个平面为例,第0个平面与前面采样层第0、1、2个平面上3个5X5filter相连,以此类推。 观察上图,前6个每个神经元对应于3个平面,6-14每个神经元对应于4个平面,15对应于6个特征平面。为什么这样采样呢?
原因有两个。首先,不完全连接方案将连接数保持在合理的范围内。更重要的是,它迫使网络的对称性被打破。不同的特征映射提取不同的(希望是互补的)特征,因为它们得到不同的输入集。连接数: (5x5+1)x3x10x10x6+(5x5+1)x4x10x10x9+(5x5+1)x6x10x10=156000 需要训练的参数:(5x5x3+1)x6+(5x5x4+1)x9+(5x5x6+1)x1=1516个。
由4个点(2X2filter)采样(也就是4个数的平均值),乘权值再加偏置,得到一个采样层的值。一层中,所乘的权值和所加的偏置值都是相同的,因此一层中只有2个需要训练的参数。因此共有2X16=32个需要训练的参数。共有(2X2+1)X5X5X16=2000个连接数。
5x5filter与采样层S4卷积运算得到1x1即C5一层只有一个元素。C5中每一个元素与S4中的16个平面全部连接,可以理解为full connection。 需要训练的参数:(5x5x16+1)x120=48120个。
全连接,(120+1)x84=10164个训练参数。
这里的激活函数是:双曲正切函数
10个手写数字 F6与输出层之间是高斯连接,输出层由欧几里得RBF单元组成,每个类别一个,每个有84个输入。
训练训练算法与BP神经网络类似,信号前向传播,误差反向传播。注意,卷积中有很多权值共享。
一般的BP神经网络,有一种头重脚轻的感觉,越往输入,神经元越多,权也越多,梯度递减问题就变得尤为严重;纵观整个LeNet-5,越往输出,权值越多,这样的一大好处是,在误差反向传播时,不会过于分散,而使得梯度逐渐消失。 源代码可参考:https://www.codeproject.com/Articles/16650/Neural-Network-for-Recognition-of-Handwritten-Digi
由于卷积神经网络已经应用十分广泛,因此很少要求大家从头开始写一个卷积神经网络。通常就是利用一个框架,实现卷积神经网络。更重要的是,如何利用卷积神经网络的原理和经验,决定卷积神经网络的结构,对哪些参数调优。其他的扔给框架就行了。
一般来说,卷积神经网络对于图像平移、扭曲等,有较强的鲁棒性。
总结 层名称输入大小输出大小卷积核或池化窗口大小输入通道数输出通道数步长卷积层c132*3228*285*5161ReLU28*2828*28/66/池化层s228*2814*142*2662卷积层c314*1410*105*56161ReLU10*1010*10/1616/池化层s410*105*52*216162接下来就是全连接了。
最后,这里也提供了关于LeNet-5的python实现,有需要的可以查看博客:卷积神经网络LeNet-5的pytorch代码实现