炒冷饭-Alexnet、vggnet、Google Inception Net、resNet、resnet后续改进

一、前言

     本篇转载自 https://blog.csdn.net/m0_37733057/article/details/70232378 , 文章对经典的深度神经网络的发展做了一些概括,另外这里也加了一些补充说明

二、Alexnet

    AlexNet是现代深度CNN的奠基之作。2012年,Hinton的学生Alex Krizhevsky提出了深度卷积神经网络模型AlexNet. AlexNet包含了6亿3000万个连接,6000万个参数和65万个神经元,拥有5个卷积层,其中3个卷积层后面连接了最大池化层,最后还有3个全连接层。AlexNet以显著的优势赢得了竞争激烈的ILSVRC 2012比赛,top-5的错误率降低至了16.4%,相比第二名的成绩26.2%错误率有了巨大的提升.

   AlexNet 网络结构图如下:

   

    AlexNet主要使用到的新技术点如下:

  • 成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。虽然ReLU激活函数在很久之前就被提出了,但是直到AlexNet的出现才将其发扬光大。

  • 训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。在AlexNet中主要是最后几个全连接层使用了Dropout。

  • 在CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。

  • 提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。

  • 使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将AlexNet分布在两个GPU上,在每个GPU的显存中储存一半的神经元的参数。

  • 数据增强,随机地从256*256的原始图像中截取224*224大小的区域(以及水平翻转的镜像),相当于增加了(256224)2*2=2048倍的数据量。如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值

在caffe中则没有区分为两块gpu 并行调用,caffe中alexnet结构图如下:

     在前几个卷积层,虽然计算量很大,但参数量很小,都在1M左右甚至更小,只占AlexNet总参数量的很小一部分。这就是卷积层有用的地方,可以通过较小的参数量提取有效的特征。虽然每一个卷积层占整个网络的参数量的1%都不到,但是如果去掉任何一个卷积层,都会使网络的分类性能大幅地下降。

三、VggNet

    VGGNet探索了卷积神经网络的深度与其性能之间的关系,为牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司的研究员于2014年提出。在2014年在ILSVRC比赛上获得了分类项目的第二名和定位项目的第一名,VggNet一共有六种不同的网络结构,但是每种结构都有含有5组卷积,每组卷积都使用3x3的卷积核,每组卷积后进行一个2x2最大池化,接下来是三个全连接层.在训练高级别的网络时,可以先训练低级别的网络,用前者获得的权重初始化高级别的网络,可以加速网络的收敛.

   网络几种不同配置如下:

    大量使用了3*3的卷积核和2*2的池化核,通过不断加深网络结构来提升性能,网络的参数量主要消耗在最后的3个全连接层。两个3*3的卷积层串联相当于1个5*5的卷积层,即一个像素会跟周围5*5的像素产生关联,可以说感受野大小为5*5。而3个3*3的卷积层串联的效果则相当于1个7*7的卷积层。除此之外,3个串联的3*3的卷积层,拥有比1个7*7的卷积层更少的参数量,只有后者的55%。最重要的是,3个3*3的卷积层拥有比1个7*7的卷积层更多的非线性变换(前者可以使用三次ReLU激活函数,而后者只有一次),使得CNN对特征的学习能力更强。

作者在对比各级网络时总结出了以下几个观点。

  1. LRN层作用不大

  2. 越深的网络效果越好。

  3. 1*1的卷积也是很有效的,但是没有3*3的卷积好,大一些的卷积核可以学习更大的空间特征。

四、InceptionNet

      Google Inception Net首次出现在ILSVRC 2014的比赛中(和VGGNet同年),那届比赛中的Inception Net通常被称为Inception V1,它最大的特点是控制了计算量和参数量的同时,获得了非常好的分类性能——top-5错误率6.67%,只有AlexNet的一半不到。有22层深,比AlexNet的8层或者VGGNet的19层还要更深。但其计算量只有15亿次浮点运算,同时只有500万的参数量,仅为AlexNet参数量(6000万)的1/12,却可以达到远胜于AlexNet的准确率。

    再来看Inception Module的基本结构,其中有4个分支:第一个分支对输入进行1*1的卷积,这其实也是NIN中提出的一个重要结构。1*1的卷积是一个非常优秀的结构,它可以跨通道组织信息,提高网络的表达能力,同时可以对输出通道升维和降维。这里主要是用作降维。结构如下:

      可以看到Inception Module的4个分支都用到了1*1卷积,来进行低成本(计算量比3*3小很多)的跨通道的特征变换。第二个分支先使用了1*1卷积,然后连接3*3卷积,相当于进行了两次特征变换。第三个分支类似,先是1*1的卷积,然后连接5*5卷积。最后一个分支则是3*3最大池化后直接使用1*1卷积。Inception Module的4个分支在最后通过一个聚合操作合并(在输出通道数这个维度上聚合)。

    Inception V1参数少但效果好的原因除了模型层数更深、表达能力更强外,还有两点:

    1、去除了最后的全连接层,用全局平均池化层(即将图片尺寸变为1*1)来取代它。全连接层几乎占据了AlexNet或VGGNet中90%的参数量,而且会引起过拟合,去除全连接层后模型训练更快并且减轻了过拟合。

    2、精心设计的Inception Module提高了参数的利用效率,网络中,不断重复上述的Inception Module模块,来提高网络的深度。

    网络的深度增加,给训练带来了很大的困难(梯度消失问题),为了更好的训练网络,GoogLeNet,在Inception(4a)和Inception(4d)的输出层,增了Loss计算误差,然后反向传播,在整个训练过程中,不断减少这个两个Loss的权重。可在caffe 官方的prototxt文件中看到.

同时,Google Inception Net还是一个大家族,包括:

  • 2014年9月的论文Going Deeper with Convolutions提出的Inception V1(top-5错误率6.67%)。

  • 2015年2月的论文Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate提出的Inception V2(top-5错误率4.8%)。

  • 2015年12月的论文Rethinking the Inception Architecture for Computer Vision提出的Inception V3(top-5错误率3.5%)。

  • 2016年2月的论文Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning提出的Inception V4(top-5错误率3.08%)。

      inception V2学习了VGGNet,用两个3*3的卷积代替5*5的大卷积(用以降低参数量并减轻过拟合),还提出了著名的Batch Normalization(以下简称BN)方法。BN是一个非常有效的正则化方法,可以让大型卷积网络的训练速度加快很多倍,同时收敛后的分类准确率也可以得到大幅提高。

BN在用于神经网络某层时,会对每一个mini-batch数据的内部进行标准化(normalization)处理,使输出规范化到N(0,1)的正态分布,减少了Internal Covariate Shift(内部神经元分布的改变)。

BN的论文指出,传统的深度神经网络在训练时,每一层的输入的分布都在变化,导致训练变得困难,我们只能使用一个很小的学习速率解决这个问题。而对每一层使用BN之后,我们就可以有效地解决这个问题,学习速率可以增大很多倍,达到之前的准确率所需要的迭代次数只有1/14,训练时间大大缩短。而达到之前的准确率后,可以继续训练,并最终取得远超于Inception V1模型的性能——top-5错误率4.8%,已经优于人眼水平。因为BN某种意义上还起到了正则化的作用,所以可以减少或者取消Dropout,简化网络结构。

      值得一提的是,caffebatchNorm使用需要搭配Scale层一起使用,详细可参考这里  , 在 resnet 50 中也有有效的应用。

五、resNet

       ResNet(Residual Neural Network)由微软研究院的Kaiming He等4名华人提出,通过使用Residual Unit成功训练152层深的神经网络,在ILSVRC 2015比赛中获得了冠军,取得3.57%的top-5错误率,同时参数量却比VGGNet低,效果非常突出。

ResNet的结构可以极快地加速超深神经网络的训练,模型的准确率也有非常大的提升。

ResNet最初的灵感出自这个问题:在不断加神经网络的深度时,会出现一个Degradation的问题,即准确率会先上升然后达到饱和,再持续增加深度则会导致准确率下降。

这并不是过拟合的问题,因为不光在测试集上误差增大,训练集本身误差也会增大。假设有一个比较浅的网络达到了饱和的准确率,那么后面再加上几个的全等映射层,起码误差不会增加,即更深的网络不应该带来训练集上误差上升。

而这里提到的使用全等映射直接将前一层输出传到后面的思想,就是ResNet的灵感来源。假定某段神经网络的输入是x,期望输出是H(x),如果我们直接把输入x传到输出作为初始结果,那么此时我们需要学习的目标就是F(x)=H(x)-x。

       

    这就是一个ResNet的残差学习单元,ResNet相当于将学习目标改变了,不再是学习一个完整的输出H(x),只是输出和输入的差别H(x)-x,即残差。这一个“弯弯的弧线“这个就是所谓的”shortcut connection“。实际中每个卷积层后还有BN层, 而且真正在使用的ResNet模块并不是这么单一,文章中就提出了两种方式

   

    这两种结构分别针对ResNet18、34(左图)和ResNet50/101/152(右图),一般称整个结构为一个”building block“。其中右图又称为”bottleneck design”,目的一目了然,就是为了降低参数的数目,第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。
对于常规ResNet,可以用于34层或者更少的网络中,对于Bottleneck Design的ResNet通常用于更深的如50、101这样的网络中,目的是减少计算和参数量。

   renet 的结构有18、34、50、101、152这几种结构,看看这五种网络结构:

注:上图中的网络层数计算仅仅指卷积或者全连接层,激活层或者Pooling层并没有计算在内

所提出的这几种网络在今年ILSVRC比赛中的结果,并且和前述网络作比较:

   六、resNet   的改进

从ResNet开始,ResNet-V2 InceptionV4、Xception、ResNext、MobileNet、ShuffleNet,以及2017CVPR的best paper的DenseNet都是借用了ResNet的思想.

(1)ResNet-V2 

     何凯明在论文Identity Mappings in Deep Residual Networks中修改了残差块的结构,结构如下图: 

新结构将relu移到残差支路,有利于信号的前向传播和梯度的反向传播,这篇文章的数学表示是比较漂亮的

(2)InceptionV4

   第四章节提到inceptionV1而在后续研究中,Inception Module模块和resnet进行了有效结合,Inception V4主要利用残差连接(Residual Connection),也就是ResNet的核心思想来改进V3结构。证明了Inception模块结合Residual Connection可以极大地加速训练,同时性能也有提升,得到一个Inception-ResNet V2网络,同时还设计了一个更深更优化的Inception v4模型,能达到与Inception-ResNet V2相媲美的性能。

(3)ResNeXt

    ResNeXt是ResNet的极限版本,代表着the next dimension。ResNeXt的论文证明了增大Cardinality(即ResNeXt中module个数)比增大模型的width或者depth效果更好,与ResNet相比参数更少,效果也更好,结构简单方便设计。

  (4)Xception

    Xception是Inception系列网络的极限版本,作者提出来一个最为重要的方法是Depthwise Separable Convlution,这在后面的MobileNet中也有体现,核心思想在于空间变换、通道变换。和Inception V3不同是先做1*1的卷积,再做3*3的卷积,这样就先将通道进行了合并,即通道卷积,然后再进行空间卷积,而Xception则正好相反,先进行空间的3*3卷积,再进行通道的1*1卷积,区别如下:  

  (5)MobileNet

     MobileNets其实就是Xception思想的应用。区别就是Exception文章重点在提高精度,而MobileNets重点在压缩模型,同时保证精度。Depthwiseseparable convolutions的思想就是,分解一个标准的卷积为一个depthwise convolutions和一个pointwise convolution。简单理解就是矩阵的因式分解,具体步骤如下图左所示。
与传统卷积的深度分离卷积的结构block的区别如下图右所示:
   

    假设,输入的feature map大小为DF * DF,维度为M,滤波器的大小为DK * DK,维度为N,并且假设padding为1,stride为1。则,原始的卷积操作,需要进行的矩阵运算次数为DK*DK*M*N*DF*DF,卷积核参数为DK *DK *N。

     Depthwise separable convolutions需要进行的矩阵运算次数为DK*DK*M*DF*DF + M *N *DF*DF,卷积核参数为DK *DK *M+N。
由于卷积的过程,主要是一个spatial dimensions减少,channel dimension增加的过程,即N>M,所以,DK *DK *N> DK *DK *M+N。
     因此,depthwiseseparable convolutions在模型大小上和模型计算量上都进行了大量的压缩,使得模型速度快,计算开销少,准确性好。

  (6)ShuffleNet

      这篇文章在mobileNet的基础上主要做了1点改进:mobileNet只做了3*3卷积的deepwiseconvolution,而1*1的卷积还是传统的卷积方式,还存在大量冗余,ShuffleNet则在此基础上,将1*1卷积做了shuffle和group操作,实现了channel shuffle 和pointwise group convolution操作,最终使得速度和精度都比mobileNet有提升。
      具体结构如下图所示: 

(a)是原始的mobileNet的框架,各个group之间相互没有信息的交流。
(b)将feature map做了shuffle操作
(c)是经过channel shuffle之后的结果。
shufflenet中也采用了分组卷积的思想,效果非常显著,间接说明了,实际上一种高效的神经网络结构设计就是应该是分组的,而不是和一般的Conv或者InnerProduct那样全部连接在一起——类似信息应该被共享,不需要重复提取;不同的分组会承担不同的功能,并且这些功能是可以被训练的。这能够告诉我们,信息是需要浓缩的。
  (7)DenseNet

    DenseNet是最近的2017CVPR的best paper,尽管是基于ResNet,但是不同的是为了最大化网络中所有层之间的信息流,作者将网络中的所有层两两都进行了连接,使得网络中每一层都接受它前面所有层的特征作为输入。由于网络中存在着大量密集的连接,作者将这种网络结构称为 DenseNet,结构如下图左所示:
 

它主要拥有以下两个特性:
1、一定程度上减轻在训练过程中梯度消散的问题。因为从上左图我们可以看出,在反传时每一层都会接受其后所有层的梯度信号,所以不会随着网络深度的增加,靠近输入层的梯度会变得越来越小。
2、由于大量的特征被复用,使得使用少量的卷积核就可以生成大量的特征,最终模型的尺寸也比较小。
一个完整的DesNet结构如下图:  

论文对网络进行设计的几个要点也进行了说明如下:
1、为了进行特征复用,在跨层连接时使用的是在特征维度上的 Concatenate 操作,而不是 Element-wise Addition操作。
2、由于不需要进行 Elewise-wise 操作,所以在每个单元模块的最后不需要一个 1X1 的卷积来将特征层数升维到和输入的特征维度一致。
3、采用 Pre-activation 的策略来设计单元,将 BN 操作从主支上移到分支之前。(BN->ReLU->1x1Conv->BN->ReLU->3x3Conv)。
4、由于网络中每层都接受前面所有层的特征作为输入,为了避免随着网络层数的增加,后面层的特征维度增长过快,在每个阶段之后进行下采样的时候,首先通过一个卷积层将特征维度压缩至当前输入的一半,然后再进行 Pooling 的操作。
5、增长率的设置。增长率指的是每个单元模块最后那个 3x3 的卷积核的数量,记为 k。由于每个单元模块最后是以 Concatenate 的方式来进行连接的,所以每经过一个单元模块,下一层的特征维度就会增长 k。它的值越大意味着在网络中流通的信息也越大,相应地网络的能力也越强,但是整个模型的尺寸和计算量也会变大。作者在本文中使用了 k=32 和 k=48 两种设置
   总结

    本文回顾了深度学习经典的神经网络的发展,作了简单的概括。总的来看,近年来在会议上有越来越多的手工设计网络的出现,一步步取代传统的网络单纯变深的思路,学界也越来越关注于寻找模型压缩和优化的方法用于处理recognition与classification这两个计算机视觉方面最为重要的问题。不要是要让accuracy更小、mAP更高、收敛曲线更好,同时还要减少计算的空间和成本。从MobileNet我们也可以看出,由于更多框架的搭建,更少的减少卷积层的内部冗余,提高运算性能和网络性能,在业界这也为深度学习向移动端发展提供了可能
 

以上第六章主要转载自https://blog.csdn.net/lucifer_zzq/article/details/79118600

猜你喜欢

转载自blog.csdn.net/AP1005834/article/details/84890819
今日推荐