在我的个人博客 <https://oysz2016.github.io/>上一篇博文
<https://oysz2016.github.io/2018/04/25/%E5%8D%B7%E7%A7%AF%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E7%9A%84%E7%BB%93%E6%9E%84%E4%B8%8E%E7%9B%B8%E5%85%B3%E7%AE%97%E6%B3%95/>
中分析了卷积神经网络的结构与相关算法,知道了这些基本原理之后。这篇博文主要介绍在卷积神经网络的发展历程中一些经典的网络模型。

LeNet5

  LeCun等将BP算法应用到多层神经网络中,提出LeNet-5模型[1](效果和paper见此处
<http://yann.lecun.com/exdb/lenet/index.html>
),并将其用于手写数字识别,卷积神经网络才算正式提出。LeNet-5的网络模型如图1所示。网络模型具体参数如图2所示。


图1 LeNet-5网络模型 表1 LeNet-5具体参数

输入:32*32的手写字体图片,这些手写字体包含0~9数字,也就是相当于10个类别的图片;
输出:分类结果,0~9之间。
  从输入输出可以知道,改网络解决的是一个十分类的问题,分类器使用的Softamx回归。

* C1:卷积核参数如表所示。卷积的后的尺寸计算公式为:
outHeight=(inHeight+2pad−filterHeight)/strides[1]+1outHeight=(inHeight+2pad−fil
terHeight)/strides[1]+1
outWidth=(inWidth+2pad−filterHidth)/strides[2]+1outWidth=(inWidth+2pad−filterHi
dth)/strides[2]+1

  因此,经过C1卷积层后,每个特征图大小为32-5+1=28,这一层输出的神经元个数为28*28*6=784。而这一层卷积操作的参数个数为5*5*1*6+6=156,其中参数个数与神经元个数无关,只与卷积核大小(此处为5*5),卷积核数量(此处为6,上一层图像默认深度为1);
* S2:输入为28*28*6,该网络使用最大池化进行下采样,池化大小为2*2,经过池化操作后输出神经元个数为14*14*6;
* C3:经过C3层后,输出为10*10*16,参数个数为5*5*6*16+16=2416个参数;
* S4:输入为10*10*16,参数与S2层一致,池化后输出神经元个数为5*5*16;
* C5
:经过C5层后,输出为1*1*120,参数个数为5*5*16*120+120=48120个参数。(这一层的卷积大小为5*5,图像的输入大小也为5*5,可等效为全连接层);
* F6:输出为1*1*84,参数个数为1*1*120*84+84=10164
参数总量:60856

  从表1的具体参数可以看出,LeNet的网络结构十分简单且单一,卷积层C1、C3和C5层除了输出维数外采用的是相同的参数,池化层S2和S4采用的也是相同的参数

AlexNet

  2012年Krizhevsky使用卷积神经网络在ILSVRC 2012图像分类大赛上夺冠,提出了AlexNet模型[2](论文地址
<https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf>
)。这篇文章凭借着诸多创新的方法,促使了之后的神经网络研究浪潮。AlexNet网络的提出对于卷积神经网络具有里程碑式的意义,相比较于LeNet5的改进有以下几点
1. 数据增强
* 水平翻转
* 随机裁剪、平移变换
* 颜色光照变换
2. Dropout:
Dropout方法和数据增强一样,都是防止过拟合的。简单的说,dropout能按照一定的概率将神经元从网络中丢弃。一个很形象的解释如图2所示,左图为dropout前,右图为dropout后。dropout能在一定程度上防止网络过拟合,并且能加快网络的训练速度。

图2 Dropout示意图
*
ReLU激活函数:ReLu具有一些优良特性,在为网络引入非线性的同时,也能引入稀疏性。稀疏性可以选择性激活和分布式激活神经元,能学习到相对稀疏的特征,起到自动化解离的效果。此外,ReLu的导数曲线在输入大于0时,函数的导数为1,这种特性能保证在输入大于0时梯度不衰减,从而避免或抑制网络训练时的梯度消失现象,网络模型的收敛速度会相对稳定[10]。
* Local Response Normalization:Local Response
Normalization要硬翻译的话是局部响应归一化,简称LRN,实际就是利用临近的数据做归一化。这个策略贡献了1.2%的Top-5错误率。
* Overlapping Pooling:Overlapping的意思是有重叠,即Pooling的步长比Pooling
Kernel的对应边要小。这个策略贡献了0.3%的Top-5错误率。
*
多GPU并行:这个太重要了,入坑了后发现深度学习真是“炼丹”的学科。得益于计算机硬件的发展,在我自己训练时,Gpu大概能比Cpu快一个数量级以上。能极大的加快网络训练。
AlextNet的网络结构如图3所示,具体参数如表2所示。

图3 AlexNet网络模型
表2 AlexNet具体参数

输入:224*224*3(RGB图像),图像会经过预处理变为227*227*3;
输出:使用的是ImageNet数据集,该数据集有1000个类,因此输出的类别也是1000个。
  从输入输出可以知道,改网络解决的是一个十分类的问题,分类器使用的Softamx回归。

* conv1:输出为55*55*96,参数个数为11*11*3*96+96=34944
* pool1:输出为27*27*96;
* conv2:输出为27*27*256,参数个数为5*5*96*256+256=614656
* pool2:输出为13*13*256;
* conv3:输出为13*13*384,参数个数为3*3*256*384+384=885120
* conv4:输出为13*13*384,参数个数为3*3*384*384+384=1327488
* conv5:输出为13*13*256,参数个数为3*3*384*256+256=884992
* pool3:输出为6*6*256;
* fc6:输出为1*1*4096,参数个数为1*1*256*4096+4096=1052672
* fc7:输出为1*1*4096,参数个数为1*1*4096*4096+4096=16781312
参数总量:21581184
  通过对比LeNet-5和AlexNet的网络结构可以看出,AlexNet具有更深的网络结构,更多的参数。

ZFNet

  ZFNet[3](论文地址 <https://arxiv.org/pdf/1311.2901.pdf>)是由纽约大学的Matthew
Zeiler和Rob
Fergus所设计,该网络在AlexNet上进行了微小的改进,但这篇文章主要贡献在于在一定程度上解释了卷积神经网络为什么有效,以及如何提高网络的性能。该网络的贡献在于:
* 使用了反卷积网络,可视化了特征图。通过特征图证明了浅层网络学习到了图像的边缘、颜色和纹理特征,高层网络学习到了图像的抽象特征;
* 根据特征可视化,提出AlexNet第一个卷积层卷积核太大,导致提取到的特征模糊;
* 通过几组遮挡实验,对比分析找出了图像的关键部位;
* 论证了更深的网络模型,具有更好的性能。

  ZFNet的网络模型如图4所示,具体参数如表3所示。

图4 ZFNet网络模型
表3 ZFNet具体参数

  ZFNet的网络模型与AlexNet十分相似,这里就不列举每一层的输入输出了。


VGG16

  VGGNet[4]是由牛津大学计算机视觉组和Google
DeepMind项目的研究员共同研发的卷积神经网络模型,包含VGG16和VGG19两种模型,其网络模型如图5所示,也可以点击此处链接
<http://ethereon.github.io/netscope/#/gist/dc5003de6943ea5a6b8b>查看网络模型。

图5 VGG16网络模型

  从网络模型可以看出,VGG16相比AlexNet类的模型具有较深的深度,通过反复堆叠3*3的卷积层和2*2的池化层,VGG16构建了较深层次的网络结构,整个网络的卷积核使用了一致的3*3的尺寸,最大池化层尺寸也一致为2*2。与AlexNet主要有以下不同:
* Vgg16有16层网络,AlexNet只有8层;
* 在训练和测试时使用了多尺度做数据增强。


GoogLeNet

  GoogLeNet[5](论文地址 <https://arxiv.org/pdf/1409.4842.pdf>
)进一步增加了网络模型的深度和宽度,但是单纯的在VGG16的基础上增加网络的宽度深度会带来以下缺陷:
* 过多的参数容易引起过拟合;
* 层数的加深,容易引起梯度消失现象。

  GoogLeNet的提出受到论文Network in Network(NIN)的启发,NIN有两个贡献:
*
提出多层感知卷积层:使用卷积层后加上多层感知机,增强网络提取特征的能力。普通的卷积层和多层感知卷积层的结构图如图6所示,Mlpconv相当于在一般的卷积层后加了一个1*1的卷积层;

图6 普通卷积层和多层感知卷积层结构图
*
提出了全局平均池化替代全连接层,从上文计算的LeNet5,AlexNet网络各层的参数数量发现,全连接层具有大量的参数。使用全局平均池化替代全连接层,能很大程度减少参数空间,便于加深网络,还能防止过拟合。

  GoogLeNet根据Mlpconv的思想提出了Inception结构,该结构有两个版本,图7是Inception的naive版。该结构巧妙的将1*1、3*3和5*5三种卷积核和最大池化层结合起来作为一层结构。

图7 Inception结构的naive版

  然而Inception的naive版中5*5的卷积核会带来很大的计算量,因此采用了与NIN类似的结构,在原始的卷积层之后加上了1*1卷积层,最终版本的Inception如图8所示。


图8 降维后的Inception模块
  GoogLeNet的模型结构如图9所示,详细参数如表4所示。

图9 GoogLeNet模型结构 表4 GoogLeNet具体参数


ResNet


  卷积神经网络模型的发展历程一次次证明加深网络的深度和宽度能得到更好的效果,但是后来的研究发现,网络层次较深的网络模型的效果反而会不如较浅层的网络,称为“退化”现象,如图10所示。

图10 退化现象

  退化现象产生的原因在于当模型的结构变得复杂时,随机梯度下降的优化变得更加困难,导致网络模型的效果反而不如浅层网络。针对这个问题,MSRA何凯明团队提出了Residual
Networks6
<https://blog.csdn.net/u010519527/article/details/%5b论文地址%5d%28https://arxiv.org/pdf/1512.03385.pdf%29>
。该网络具有Residual结构如图11所示。


图11 Residual 结构
  ResNet的基本思想是引入了能够跳过一层或多层的“shortcut connection”,即增加一个identity
mapping(恒等映射),将原始所需要学的函数H(x)转换成F(x)+x,而作者认为这两种表达的效果相同,但是优化的难度却并不相同,作者假设F(x)的优化
会比H(x)简单的多。这一想法也是源于图像处理中的残差向量编码,通过一个reformulation,将一个问题分解成多个尺度直接的残差问题,能够很好的起到优化训练的效果。
  这个Residual block通过shortcut
connection实现,通过shortcut将这个block的输入和输出进行一个element-wise的加叠,这个简单的加法并不会给网络增加额外的参数和计算量,同时却可以大大增加模型的训练速度、提高训练效果,并且当模型的层数加深时,这个简单的结构能够很好的解决退化问题。

  首先构建了一个18层和一个34层的plain网络,即将所有层进行简单的铺叠,然后构建了一个18层和一个34层的residual网络,仅仅是在plain上插入了shortcut,而且这两个网络的参数量、计算量相同,并且和之前有很好效果的VGG-19相比,计算量要小很多。(36亿FLOPs
VS 196亿FLOPs,FLOPs即每秒浮点运算次数。)这也是作者反复强调的地方,也是这个模型最大的优势所在。

  模型构建好后进行实验,在plain上观测到明显的退化现象,而且ResNet上不仅没有退化,34层网络的效果反而比18层的更好,而且不仅如此,ResNet的收敛速度比plain的要快得多。
对于shortcut的方式,作者提出了三个策略:
* 使用恒等映射,如果residual block的输入输出维度不一致,对增加的维度用0来填充;
* 在block输入输出维度一致时使用恒等映射,不一致时使用线性投影以保证维度一致;
* 对于所有的block均使用线性投影。

ResNet论文的最后探讨了阻碍网络更深的瓶颈问题,如图12所示,论文中用三个1x1,3x3,1x1的卷积层代替前面说的两个3x3卷积层,第一个1x1用来降低维度,第三个1x1用来增加维度,这样可以保证中间的3x3卷积层拥有比较小的输入输出维度。

图12 更深的residual block
参考文献

[1] 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.
[2] Krizhevsky A, Sutskever I, Hinton G E. ImageNet classification with deep
convolutional neural networks[C]// International Conference on Neural
Information Processing Systems. Curran Associates Inc. 2012:1097-1105.
[3] Zeiler M D, Fergus R. Visualizing and Understanding Convolutional
Networks[J]. 2013, 8689:818-833.
[4] Simonyan K, Zisserman A. Very Deep Convolutional Networks for Large-Scale
Image Recognition[J]. Computer Science, 2014.
[5] Szegedy C, Liu W, Jia Y, et al. Going deeper with convolutions[C]// IEEE
Conference on Computer Vision and Pattern Recognition. IEEE Computer Society,
2015:1-9.
[6] He K, Zhang X, Ren S, et al. Deep Residual Learning for Image
Recognition[C]// Computer Vision and Pattern Recognition. IEEE, 2016:770-778.