zoukankan      html  css  js  c++  java
  • 【DL-2-2】卷积神经网络(CNN)--AlexNet、ZFNet、VGGNet、GoogleNet、ResNet

    目录

    1. 背景介绍
    2. AlexNet(2012)
    3. VGGNet(2014)
    4. GoogleNet
    5. ResNet(2015)

    一、背景介绍

    卷积神经网络(Convolutional Neural Networks,CNN),CNN可以有效的降低反馈神经网络(传统神经网络)的复杂性,常见的CNN结构有LeNet-5、AlexNet、ZFNet、VGGNet、GoogleNet、ResNet等等,其中在LVSVRC2015冠军ResNet是AlexNet的20多倍,是VGGNet的8倍;从这些结构来讲CNN发展的一个方向就是层次的增加,通过这种方式可以利用增加的非线性得出目标函数的近似结构,同时得出更好的特征表达,但是这种方式导致了网络整体复杂性的增加,使网络更加难以优化,很容易过拟合。

    CNN的应用主要是在图像分类和物品识别等应用场景应用比较多

    1. 数据输入层:Input Layer
    2. 卷积计算层:CONV Layer
    3. ReLU激励层:ReLU Incentive Layer
    4. 池化层:Pooling Layer
    5. 全连接层:FC Layer

    备注:Batch Normalization Layer(可能有)

    1. LeNet:最早用于数字识别的CNN
    2. AlexNet:2012年ILSVRC比赛冠军,远超第二名的CNN,比LeNet更深,用多层小卷积叠加来替换单个的大卷积
    3. ZF Net:2013ILSVRC冠军
    4. GoogleNet:2014ILSVRC冠军
    5. VGGNet:2014ILSVRC比赛中算法模型,效果率低于GoogleNet,但是使用较多,因为简单。
    6. ResNet:2015ILSVRC冠军,结构修正以适应更深层次的CNN训练

    模型名

    AlexNet

    ZFNet

    VGG

    GoogLeNet

    ResNet

    年份

    2012

    2013

    2014

    2014

    2015

    层数

    8

    8

    19

    22

    152

    Top-5错误

    16.4%

    11.2%

    7.3%

    6.7%

    3.57%

    Data Augmentation

    +

    +

    +

    +

    +

    Inception(NIN)

    +

    卷积层数

    5

    5

    16

    21

    151

    卷积核大小

    11,5,3

    7,5,3

    3

    7,1,3,5

    7,1,3,5

    全连接层数

    3

    3

    3

    1

    1

    全连接层大小

    4096,4096,1000

    4096,4096,1000

    4096,4096,1000

    1000

    1000

    Dropout

    +

    +

    +

    +

    +

    Local Response Normalization

    +

    +

    +

    Batch Normalization

    +

    二:AlexNet(2012)

    2.1 网络背景

      AlexNetHinton的学生Alex Krizhevsky2012年提出,并在当年取得了Imagenet比赛冠军。AlexNet可以算是LeNet的一种更深更宽的版本,证明了卷积神经网络在复杂模型下的有效性,算是神经网络在低谷期的第一次发声,确立了深度学习,或者说卷积神经网络在计算机视觉中的统治地位。

    2.2 网络结构

      AlexNet的结构及参数如上图所示,是8层网络结构(忽略激活,池化,LRN,和dropout层),有5个卷积层和3个全连接层,第一卷积层使用大的卷积核,大小为11*11,步长为4,第二卷积层使用5*5的卷积核大小,步长为1,剩余卷积层都是3*3的大小,步长为1。激活函数使用ReLu(虽然不是他发明,但是他将其发扬光大),池化层使用重叠的最大池化,大小为3*3,步长为2。在全连接层增加了dropout,第一次将其实用化。(参考:AlexNet详细解释

    2.3 网络特点

    使用两块GPU并行加速训练,大大降低了训练时间

    成功使用ReLu作为激活函数,解决了网络较深时的梯度弥散问题

    使用数据增强、dropout和LRN层来防止网络过拟合,增强模型的泛化能力

    pool层是使用3*3核stride为2,进行处理,使得重复覆盖,提取特征更丰富

    2.4 AlexNet结构优化(对比lenet-5)

    1. 非线性激活函数:ReLU,解决了网络较深时的梯度弥散问题
    2. 在最后 的 FC 层采用 Dropout随机 激活 的机制 ,防止 模型 过拟合 ;
    3. 采用 LRN 局部响应归一化 ,将相邻通道的值进行归一化处理, 抑制局部很大的值,提高模型的泛化能力 。
    4. 大数据训练:百万级ImageNet图像数据
    5. 使用两块GPU并行加速训练,大大降低了训练时间
    6. 将最大池化变为了平均,步长小,使得重复覆盖,提取特征更丰富

    2.5 ZFNet

    在AlexNet的基础三,使用可视化技术:逆变换发现AlexNet潜在的问题,做了如下调整:

    Conv1 11*11 stride =4 改进为:7*7 stride = 2

    Conv 3,4,5 由384,384,256改为512 ,1024,512

    三:VGGNet(2014)

    3.1 网络背景

      VGGNet是牛津大学计算机视觉组和Google DeepMind公司一起研发的深度卷积神经网络,并取得了2014年Imagenet比赛定位项目第一名和分类项目第二名。该网络主要是泛化性能很好,容易迁移到其他的图像识别项目上,可以下载VGGNet训练好的参数进行很好的初始化权重操作,很多卷积神经网络都是以该网络为基础,比如FCN,UNet,SegNet等。vgg版本很多,常用的是VGG16,VGG19网络。

    3.2 网络结构

    - VGG16包含了16个隐藏层(13个卷积层和3个全连接层),如上图中的D列所示

    - VGG19包含了19个隐藏层(16个卷积层和3个全连接层),如上图中的E列所示

    VGG网络的结构非常一致,从头到尾全部使用的是3x3的卷积和2x2max pooling

     上图为VGG16的网络结构,共16层(不包括池化和softmax层),所有的卷积核都使用3*3的大小,池化都使用大小为2*2,步长为2的最大池化,卷积层深度依次为64 -> 128 -> 256 -> 512 ->512。

    3.3 网络特点

    网络结构和AlexNet有点像,不同的地方在于:

    1. 主要的区别,更深,把网络层数加到了16-19层(不包括池化和softmax层),而AlexNet是8层结构。
    2. 将卷积层提升到卷积块的概念。卷积块有2~3个卷积层构成,使网络有更大感受野的同时能降低网络参数,同时多次使用ReLu激活函数有更多的线性变换,学习能力更强(详细介绍参考:TensorFlow实战P110页)。
    3. 在训练时和预测时使用Multi-Scale做数据增强。训练时将同一张图片缩放到不同的尺寸,在随机剪裁到224*224的大小,能够增加数据量。预测时将同一张图片缩放到不同尺寸做预测,最后取平均值。
    4. 前面的Conv占用大量的memory,后面的FC占用大量的参数,使得最终参数多达138M个。
    5. 取消LRN,因为实际发现使用LRN,反而降低功效。

    四:GoogleNet

    4.1 网络背景

    Top5错误率6.7%;使用9个inception模块,改变CNN原串行结构,并行,共22层;使用平均池化替代FC层;参数量仅为AlexNet的1/12;使用softmax获取平均结果;网络结构的更新,性能比AlexNet要好;2014年ILSVRC冠军。

    4.2 网络结构

    Network-in-Network主要思想:用全连接的多层感知机去代替传统的卷积过程,以获取特征更加全面的表达,同时,因为前面已经做了提升特征表达的过程,传统CNN最后的全连接层也被替换为一个全局平均池化层,因为作者认为此时的map已经具备分类足够的可信度了,它可以直接通过softmax来计算loss了。

    1. 提供更"宽"的网络结构(1x1 3x3 5x5 ),使网络可自由选择更好的特征,maxpooling则是去掉上一层卷积下来的冗余信息。
    2. 通过1x1的卷积核,实现降维和升维,达到减少参数的目的,其中,降维是利用了1x1的卷积核可线性组合不同通道上的特征的特性。(这与稀疏网络结构也密切相关)
    3. Inception还使用了中间节点辅助分类,给予小一点的权值,利用中间某一层的输出来作分类,起到模型融合的效果。并且增加反馈梯度信号及额外正则化。

    Inception结构改进

    架构的第二个主要思想:在计算要求增加很多的地方应用维度缩减和预测。即,在3x3和5x5的卷积前用一个1x1的卷积用于减少计算,还用于修正线性激活。如下图所示,左边是加入维度缩减之前的,右边是加入维度缩减之后的(实际是压缩通道数来实现,参数由854M降低到358M)。

       

    4.3 网络特点

    1. GoogLeNet借鉴了NIN的特性,在原先的卷积过程中附加了1*1的卷积核加上ReLU激活;
    2. 这不仅仅提升了网络的深度,提高了representation power,而且文中还通过1*1的卷积来进行降维,减少了更新参数量;
    3. 平均池化替代FC,减少参数,提升正确率;
    4. 前两个softmax作为辅助分类器,输出中间的分类结果,与最后一个softmax一起作权重求和,得出最终的分类。这种形式能更好利用底层网络特征,更好地结合不通层次抽取的特征来提升模型效果。

    五:ResNet(2015)

    5.1 网络背景

    ResNet灵感来源:

    这来自于困扰深度学习领域的一个Degradation的问题,即在不断加深神经网络深度时,准确率会先上升然后达到饱和,再持续增加深度则会导致准确率下降。这并不是过拟合的问题,因为不光在测试集上误差增大,训练集本身误差也会增大。

    ResNet(残差神经网络)由微软研究院的何凯明等4名华人于2015年提出,成功训练了152层超级深的卷积神经网络,效果非常突出,而且容易结合到其他网络结构中。比VGG深8倍,超深网络,最高可以达到152层;引入残差结构,更改参数w的修改规则;top-5错误率3.6%;参数更新中使用到RNN的思想在五个。主要任务轨迹中都获得了第一名的成绩:

    • ImageNet分类任务:错误率3.57%
    • ImageNet检测任务:超过第二名16%
    • ImageNet定位任务:超过第二名27%
    • COCO检测任务:超过第二名11%
    • COCO分割任务:超过第二名12%

    作为大神级人物,何凯明凭借Mask R-CNN论文获得ICCV2017最佳论文,也是他第三次斩获顶会最佳论文,另外,他参与的另一篇论文:Focal Loss for Dense Object Detection,也被大会评为最佳学生论文。

    5.2 网络结构

    通过不断堆叠这个基本模块,就可以得到最终的ResNet模型,理论上可以无限堆叠而不改变网络的性能。下图为一个34层的ResNet网络。

    使用了一种连接方式叫做"shortcut connection",顾名思义,shortcut就是"抄近道"的意思,图为残差神经网络的基本模块(专业术语叫残差学习单元),输入为x,输出为F(x)+x,F(x)代表网络中数据的一系列乘、加操作,假设神经网络最优的拟合结果输出为H(x)=F(x)+x,那么神经网络最优的F(x)即为H(x)与x的残差,通过拟合残差来提升网络效果。为什么转变为拟合残差就比传统卷积网络要好呢?因为训练的时候至少可以保证残差为0,保证增加残差学习单元不会降低网络性能,假设一个浅层网络达到了饱和的准确率,后面再加上这个残差学习单元,起码误差不会增加。

    F(x)这种残差模式可以去掉x本身值的影响,扩大残差的影响,突出这个微小的变化。

    如下图所示:

    -------------------------------------------------------------------------------------------------------------------------------

    真正在使用的ResNet模块并不是这么单一,文章中就提出了两种方式:右下的方式为了较少参数的数量。

    Note: 其实这里有一个小tips,下面右边那张图有两种不同的结构,但是可以发现,如果采用的是第一种结构,则参数数目大约为(这里先假设输入输出都为256-d):

    左图:3x3x256x64 + 3x3x64x256 = 294912

    右图:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632

    两者相差将近5倍,显然用右边的结构能够在比较深的网络中仍然能保持参数的规模不至于过大(它是一个先用1*1降维,再3*3的普通卷积,再1*1升维的过程,1*1的卷积计算量很小,同时降维之后在3*3的卷积部分也会由于维度下降导致训练时间减少,参数数目也会减少,从而使得整体的训练时间减少。)

    网络的参数减少了很多,训练也就相对容易一些。然后我们再看一下原作中的ResNet全貌!

    来看50-layer那一栏(在深度为50的网络中,是通过构造了一个长度为 16 的block列表,得到了16*3=48层,加上输入输出2层,最终为50层; (3+4+6+3)*3 + 2 = 50 ),在进入到DBA层之前的网络比较简单,分别是:①卷积层"7×7, 64, stride 2"、②BN层、③ReLU层、④池化层"3×3 max pool, stride 2",最终的输出结果是一个大小为 [batch_size, height, width, kernels] 矩阵,很简单,不再赘述,关于BN可以参考这里。我们深入一下,再看第一个DBA(Deeper Bottleneck Architectures)内部,如下图

    很显然,总共3×3=9层,可是原作毕竟篇幅有限,网络实现的细节不是很清楚,于是我就参考了Ryan Dahl的tensorflow-resnet程序源码,按照Ryan Dahl实现的ResNet,画出了DBA内部网络的具体实现,这个DBA是全网络中第一个DBA的前三层,输入的image大小为[batch_size,56,56,64],输出大小为[batch_size,56,56,256]。下图是一个完整的 bottleneck 结构图:

    --------------------------------------------------------------------------------------------------------------------------------------

    两种Shortcut Connection方式:实线的的Connection部分("第一个粉色矩形和第三个粉色矩形")都是3x3x64的特征图,他们的channel个数一致,所以采用计算方式:y=F(x)+x

    虚线的Connection部分("第一个绿色矩形和第三个绿色矩形")分别是3x3x64和3x3x128的特征图,他们的channel个数不同(64和128),所以采用计算方式:y=F(x)+Wx

    其中W是卷积操作,用来调整x的channel维度的。

    5.3 网络特点

    使得训练超级深的神经网络成为可能,避免了不断加深神经网络,准确率达到饱和的现象(后来将层数增加到1000层)输入可以直接连接到输出,使得整个网络只需要学习残差,简化学习目标和难度。

    设计优化:我们的基本设计方案(VGG-style),所有的3x3卷积层(几乎所有);空间规模/2=>#过滤器x2 (~每一层的复杂度相同);简约的设计风格;保持设计风格的简约性

    ResNet是一个推广性非常好的网络结构,容易和其他网络结合

    有集成算法的思想:基本上每层都会对最后结果产生影响

    相比较其它网络的层次会使得最后梯度消失,理论上可以任意层,但是152后并没有改善

    附件:论文

    1. LeNet论文
    2. AlexNet论文 :8层 (ILSVRC 2012)
    3. GoogleNet, 22层 (ILSVRC 2014)
    4. VGGNet论文 :19层 (ILSVRC 2014) 论文翻译
    5. ResNet论文 :152 层 (ILSVRC 2015)

       

    参考博文:

    https://www.jianshu.com/p/58168fec534d --AlexNet

    https://www.cnblogs.com/wj-1314/p/9754072.html --概览性质

    https://www.leiphone.com/news/201608/vhqwt5eWmUsLBcnv.html ---ResNet

    http://www.luyixian.cn/news_show_12380.aspx ---ResNet

    https://www.jianshu.com/p/e502e4b43e6d ---ResNet的DBA简介

    https://zhuanlan.zhihu.com/p/39316040 ---ResNet的Resnet V2介绍

  • 相关阅读:
    重定向请求
    json处理
    post请求
    get请求
    提交cookie登录
    进击的Python【第三章】:Python基础(三)
    进击的Python【第二章】:Python基础(二)
    进击的Python【第一章】:Python背景初探与Python基础(一)
    java 内存分析
    java--循环练习
  • 原文地址:https://www.cnblogs.com/yifanrensheng/p/12832493.html
Copyright © 2011-2022 走看看