自己搭建神经网络时,一般都采用已有的网络模型,在其基础上进行修改。从2012年的AlexNet出现,如今已经出现许多优秀的网络模型,如下图所示。 主要有三个发展方向:

    Deeper:网络层数更深,代表网络VggNet

    Module: 采用模块化的网络结构(Inception),代表网络GoogleNet

    Faster: 轻量级网络模型,适合于移动端设备,代表网络MobileNet和ShuffleNet

    Functional: 功能型网络,针对特定使用场景而发展出来。如检测模型YOLO,Faster RCNN;分割模型FCN, UNet

  其发展历史可以分为三个阶段:

  这些模型在ImageNet上的表现效果对比如下:

  

1. LeNet-5

  LeNet-5是LeCun在1998年的论文中Gradient-Based Learning Applied to Document Recognition 提出的网络模型,其结构如下:(其中卷积为5*5的kernel,下采样为2*2的MaxPooling),其结构比较简单,关于LeNet-5结构设计的详细分析,参见:参考一参考二

 2. AlexNet

  AlexNet是Alex Krizhevsky在2012的文章ImageNet Classification with Deep Convolutional Neural Networks中提出,其结构模型如下:(分上下两部分卷积,计算力不足,放在两块GPU上)

  AlexNet的特色:参考1参考2

    (1) Training on Multiple Gpus:  受于当时的算力限制,Alexnet创新地将图像分为上下两块分别训练,然后在全连接层合并在一起

    (2) ReLU Nonlinearity: 采用ReLU激活函数代替Sigmoid或tanh, 解决了梯度饱和的问题

    (3)Local Response Normalization: 局部响应归一化,

    (4) Data Augmentation: 扩增数据,减小过拟合:第一种是 抠图(从256x256抠出224x224)加上水平反转。第二种是 改变RGB颜色通道强度。

    (5) Dropout: 以一定概率舍弃神经元输出,减小过拟合。

3.ZFNet

   ZFNet是2013年的论文Visualizing and Understanding Convolutional Networks中提出,是2013年ILSVRC的冠军。这篇文章使用反卷积(Deconvnet),可视化特征图(feature map),通过可视化Alex-net指出了Alex-net的一些不足,最后修改网络结构,使得分类结果提升;是CNN领域可视化理解的开山之作,作者通过可视化解释了为什么CNN有非常好的性能、如何提高CNN性能,然后进行调整网络,提高了精度(参考文章

   ZFNet通过修改结构中的超参数来实现对AlexNet的改良,具体说来就是增加了中间卷积层的尺寸,让第一层的步长和滤波器尺寸更小。其网络结构的两种表示图如下:

    相比于AlexNet其改进如下:(ImageNet top5 error:16.4%提升到11.7%)

      (1) Conv1: 第一个卷积层由(11*11, stride=4)变为(7*7,stride=2)

      (2) Conv3, 4, 5: 第三,四,五个卷积核的通道数由384,384,256变为512,1024,512

 3. VGGNet

  VGGNet是2014年论文Very Deep Convolutional Networks for Large-scale Image Recognition 中提出,2014年的ImageNet比赛中,分别在定位和分类跟踪任务中取得第一名和第二名,其主要的贡献是展示出网络的深度(depth)是算法优良性能的关键部分,其结构如下:

  VGGNet的特色:(参考1参考2)

    (1) 结构简洁:5层卷积层、3层全连接层、softmax输出层构成,层与层之间使用max-pooling(最大化池)分开,所有隐层激活单元都采用ReLU函数。

    (2)小卷积核和多卷积核:VGG使用多个较小卷积核(3x3)的卷积层代替一个卷积核较大的卷积层,一方面可以减少参数,另一方面相当于进行了更多的非线性映射,可以增加网络的拟合/表达能力。

     VGG的作者认为两个3x3的卷积堆叠获得的感受野大小,相当一个5x5的卷积;而3个3x3卷积的堆叠获取到的感受野相当于一个7x7的卷积。这样可以增加非线性映射,也能很好地减少参数(例如7x7的参数为49个,而3个3x3的参数为27),如下图所示:

   VGGNet提出的结论:

    (1) LRN层无性能增益(A-LRN):AlexNet曾经用到的LRN层(local response normalization,局部响应归一化)并没有带来性能的提升
    (2) 随着深度增加,分类性能逐渐提高(从11层到19层)
    (3) 多个小卷积核比单个大卷积核性能好

4. GoogLeNet

  4.1 GoogLeNet V1

    GoogLetNet V1是在2014年论文Going deeper with convolutions中提出的,ILSVRC 2014的胜利者。相比于VGG,其并不是单纯的将网络加深,还引入了Inception模块的概念,最终性能和VGG差不多,但参数量更少。

    Inception提出原因:传统网络为了减少参数量,减小过拟合,将全连接和一般卷积转化为随机稀疏连接,但是计算机硬件对非均匀稀疏数据的计算效率差,为了既保持网络结构的稀疏性,又能利用密集矩阵的高计算你性能,Inception网络结构的主要思想是寻找用密集成分来近似最优局部稀疏连接,通过构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构

    Inception的结构如下图所示:

    Inception架构特点:

      (1)加深的基础上进行加宽,稀疏的网络结构,但能产生稠密的数据,既能增加神经网络表现,又能保证计算资源的使用效率

      (2) 采用不同大小的卷积核意味着不同的感受野,最后在channel上拼接,意味着不同尺度的特征融合

      (3)采用1*1卷积,一是减少维度来减少计算量和参数,二是修正线性激活,增加非线性拟合能力(每个1*1后都有ReLU激活函数)

    以Inception为基础模块,GoogLeNet V1的整体网络架构如下(共22层):

    GoogLeNet V1网络特色:参考1参考2

      (1) 采用Inception模块化结构,方便添加修改

      (2) 采用Average Pool 来代替全连接层(借鉴Network in Network),实际在最后一层还是添加了一个全连接层,方便做finetune。

      (3) 另外增加了两个辅助的softmax分支(incetion 4b和4e后面),作用有两点,一是为了避免梯度消失,用于向前传导梯度。反向传播时如果有一层求       导为0,链式求导结果则为0。二是将中间某一层输出用作分类,起到模型融合作用。最后的loss=loss_2 + 0.3 * loss_1 + 0.3 * loss_0。实际测        试时,这两个辅助softmax分支会被去掉。

  4.2 GoogLeNet V2, V3

     GoogLeNet V2, V3是在2015年论文Rethinking the Inception Architecture for Computer Vision  中提出,主要是对V1的改进。

     GoogLeNet v2的Inception结构和整体的架构如下:

      GoogLeNet V2网络特点:

        (1) 借鉴VGG,用两个3*3卷积代替一个5*5卷积,降低参数量,提高计算速度(如上图Figure5中Inception)

        (2)它们将滤波器大小nxn的卷积分解为1xn和nx1卷积的组合(7x7卷积相当于首先执行1x7卷积,然后在其输出上执行7x1卷积,如上图Figure6中Inception),但在网络的前期使用这种分解效果并不好,在中度大小的特征图(feature map)上使用效果才会更好(特征图大小建议在12到20之间)

        (3) 为了同时保持特征表示并降低计算量,将池化和卷积并行执行再合并,如下图所示:

    GoogLeNet V3: V3包含了为V2规定的所有上述改进,另外还使用了以下内容:

      (1)采用RMSProp优化器

        (2) 学习Factorization into small convolutions的思想,将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),这样的好处,既可以加        速计算(多余的计算能力可以用来加深网络),又可以将1个conv拆成2个conv,使得网络深度进一步增加,增加了网络的非线性,还有值得注           意的地方是网络输入从224x224变为了299x299,更加精细设计了35x35/17x17/8x8的模块。

      (3) 在辅助分类器中的使用BatchNorm。

      (4) 采用标签平滑(添加到损失公式中的一种正规化组件,可防止网络对类过于自信。防止过度拟合)

  4.3 GoogLeNet V4

    GoogLeNet V4(Inception V4)是在2016年的论文 Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning 中提出,主要是利用残差网络(ResNet)来改进V3,得到Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4网络。

5. ResNet

   ResNet是何凯明在2015年的论文Deep Residual Learning for Image Recognition 中提出,ResNet网络提出了残差网络结构,解决了以前深层网络难训练的问题,将网络深度有GoogLeNet的22层提高到了152层。残差网络(bottleneck)的结构如下:(参考1

  相比传统网络:y=f(x),ResNet Block公式为:y=f(x) + x,可以称之为skip connect。有两个点需要思考下:一是其导数总比原导数加1,这样即使原导数很小时,也能传递下去,能解决梯度消失的问题; 二是y=f(x) + x式子中引入了恒等映射(当f(x)=0时,y=2),解决了深度增加时神经网络的退化问题。

  ResNet由多个Residual Block叠加成的,其结构如下:

    其中Resnet-18/34采用的residual block和Resnet-50/101/152不太一样,分别如下所示:

  除了残差结构,ResNet还有两个细节需要关注下

    (1)第一个卷积层采用了7*7的大卷积核,更大的感受野,获取图片更多的初始特征(primary feature) (图片channel=3,第一层使用大kernel,增加的参     数量不是很大)

·    (2)短路连接中,输入和输出维度不一致时,不能直接相加(Element-wise add),采用步长为2的卷积来减小维度尺寸?

6. DenseNet

    DenseNet网络是在2017的论文 Densely Connected Convolutional Networks 中提出,与ResNet一致,也采用shortcut连接,但是其将前面所有层与后面层密集连接(dense connection), 另外其采用channel concatenate来实现特征重用(代替ResNet的Element-wise addition)。其整体网络结构如下图所示:

    DenseNet网络包括Dense Block和Transition layer两个基础模块,Dense Block类似于ResNet中的residual block,其区别对比如下:

      由上图可以发现两个主要区别:(参考1

         (1) DenseNet是密集连接,前面层和后面层间都有连接;ResNet只有相邻层有连接

         (2) DenseNet是channel-wise concatenation; Resnet 是Element-wise addition

    DenseNet的Transition layer主要是用来降低feature map的尺寸,将来自不同层的feature map变化为同等尺寸后进行concatenate,其结构如下:

      BN + ReLU+1*1 Conv + 2*2 Average Pool

  

    DenseNet的特点:

      (1) 由于密集连接方式,DenseNet提升了梯度的反向传播,使得网络更容易训练 (每层可以直达最后的误差信号)

      (2) 参数更小且计算更高效 (concatenate来实现特征复用,计算量很小)

       (3) 由于特征复用,分类器使用到了低级特征

       (4) 需要较大的显存才能运行(所有层都需存储?)

参考:https://zhuanlan.zhihu.com/p/66215918

   https://zhuanlan.zhihu.com/p/22038289

    上述都是些大型的经典网络,运行较慢,需要的较大的算力,而轻量级网络则采用不同的设计和模型架构,来应对移动端设备上的使用,目前主要的轻量级网络包括 SqueezzeNet, MobileNet和ShuffleNet,其发展历史如下:

  这些网络实现轻量级的主要方法如下:

    (1) 优化网络结构: shuffle Net

    (2) 减少网络的参数: Squeeze Net

    (3) 优化卷积计算: MobileNet(改变卷积的顺序); Winograd(改变卷积计算方式)

    (4) 删除全连接层: Squeeze Net; LightCNN

 7. SqueezeNet

   SqueezeNet是在2017年的论文 SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size中提出, squeezeNet的模型压缩策略主要有三个:(Idea from GoogLeNet)   (参考1

     (1) 多使用1*1的卷积,少使用3*3的卷积,减少参数量

     (2) 3*3卷积采用更少的channel数

     (3) 将降采样后置,即推迟使用Pooling,从而增加感受野,尽可能多的获得feature

  SqueezeNet的网络基础单元是Fire Module,多个fire module堆叠,结合pooling组成SqueezeNet,如下图所示:(右边两张加入了shortcut)

   Fire Module又包括两部分:squeeze layer 和 Expand layer,如下图所示:

       squeeze layer:主要是1*1的卷积,对网络channel进行压缩,卷积核的个数为S1

      expand layer:1*1的卷积个数为E1,3*3的卷积个数为E3(上图中E2应该为E3),然后进行concate。

      论文中关于E1, E3,S1的关系描述如下:

 8. MobileNet

  8.1 MobileNet V1

    MobileNet V1是在2017年Google的论文 MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications中提出,其主要压缩策略是深度可分离卷积(Depthwise separable Convolution),其包括两步,如下图所示:

         (1) 深度卷积:将卷积拆分为单通道的形式,在不改变输入特征图像的深度的情况下,对每一通道进行卷积操作,得到和输入特征图通道数一致的输出特征图。如下图,输入12×12×3的特征图,经过5×5×1×3的深度卷积之后,得到了8×8×3的输出特征图。输入个输出的维度是不变的3。

    (2)逐点卷积:即1*1的卷积,对深度卷积得到的特征图进行升维,如下图,8×8×3的特征图,通过1*1*3*256的卷积,输出8*8*256的输出特征图。

    参数量和计算量对比:

      深度可分离卷积和传统卷积相比操作和参数更少,如下图所示,可以发现深度可分离卷积操作数和参数都是传统卷积的(1/N +1/Dk2), 采用3*3卷积时大约是1/9。(但模型精度大概只降低1%)

     模型结构对比:

       深度可分离卷积单元相比传统卷积多一个ReLU6激活函数和1*1卷积层,对比如下图:

    MobileNet V1网络的整体架构如下图, 多个深度卷积的堆叠(s2表示步长为2),: (参考1)

    MobileNet V1还可以引入结构超参数来进一步压缩网络,主要是在kernel的深度和尺寸两方面,如下图:

   8.2 MobileNet V2

    MobileNet V2是在2018年的论文 MobileNetV2: Inverted Residuals and Linear Bottlenecks 中提出,对V1的卷积单元进行了改进,主要引入了Linear bottleneck和Inverted residuals。

    (1) Linear bottleneck : 在原始V1训练时容易出现卷积层参数为空的现象,这是由于ReLU函数:对低维度做ReLU运算,很容易造成信息的丢失。而在高维度进行ReLU运算的话,信息的丢失则会很少参考);因此去掉卷积单元中最后一个ReLU函数。

      (Linear bottleneck: Eltwise + with no ReLU at the end of the bottleneck)

    (2) Inverted Residual: 深度卷积本身没有改变channel的能力,来的是多少通道输出就是多少通道。如果来的通道很少的话,DW深度卷积只能在低维度上工作,这样效果并不会很好,所以我们要“扩张”通道。既然我们已经知道PW逐点卷积也就是1×1卷积可以用来升维和降维,那就可以在DW深度卷积之前使用PW卷积进行升维(升维倍数为t,t=6),再在一个更高维的空间中进行卷积操作来提取特征,随后再进行降维。

      (Inverted Residual: expand - transfer - reduce)

    对比下V2和ResNet的结构,如下图:可以发现V2是先升,卷积,降维,和ResNet(降维,卷积,升维)相反,因此成为Inverted residual.

  Linear bottleneck和Inverted Residual解释:

    对比下V1和V2的卷积结构单元,如下图:V2将最后一层的ReLU6换成了Linear,并引入了shortcut进行升维和将维(最右边的stride=2减小尺寸,所以没有shortcut)。

    MobileNet V2的整体结构如下图:

    8.3 MobileNet V3

        MobileNet V3在2019年的论文Searching for MobileNetV3 中提出,还没啃完,有空来填坑。

 9 ShuffleNet

   9.1 shuffleNet V1

      shuffleNet V1 是2017年在论文ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices 中提出的,其主要压缩思路是group convolution 和 channel shuffle。(参考1参考2

      (1) group convolution(分组卷积): 分组卷积的思路是将输入特征图按通道数分为几组,然后采用不同的卷积核再对各个组进行卷积,这样会降低卷积的计算量。传统的卷积是卷积核在所有通道上进行卷积,算全通道卷积,而分组卷积算通道上的稀疏卷积,如下图所示。(mobileNet算是一种特殊的分组卷积,分组数和通道数一样)

      (2)channel shuffle(通道混洗) : 分组卷积以一个问题是不同组之间的特征图信息不通信,就好像分了几个互不相干的路,大家各走各的,会降低网络的特征提取能力。MobileNet是采用密集的1*1pointwise convolution进行通道特征融合,计算量较大。channel shuffle的思路是对分组卷积之后的特征图的排列顺序进行打乱重新排列,这样下一个分组卷积的输入就来自不同的组,信息可以在不同组之间流转。channel shuffle的实现步骤如下图所示:reshape--transpose-flatten

    shufflleNet V1网络的基本单元如下图所示,相比a图中,b图将1x1的密集卷积换成分组卷积,添加了一个channel shuffle,另外3x3的depthwise convolution之后没有使用ReLU激活函数,图c中则采用stride=2,同时将elment-wise add 换成了concat。

   shuffleNet V1特点,以及和ResNet和mobileNet的对比如下:

   ShuffleNet V1的整体架构如下,每个stage都是shuffleNet基本单元的堆叠。

   9.2 shuffleNet V2

      shuffleNet V2 是2018年在论文ShuffleNet V2: Practical Guidelines for Ecient CNN Architecture Design中提出的, 论文中针对设计快速的轻量级模型提出了四条指导方针(Guidelines):

    (1)G1: 卷积层的输入和输出特征通道数相等时MAC最小,此时模型速度最快

    (2)G2: 过多的 group操作会增大MAC,从而使模型速度变慢

    (3) G3: 模型中的分支数量越少,模型速度越快

    (4) G4:element-wise操作所带来的时间消耗远比在FLOPs上的体现的数值要多,因此要尽可能减少element-wise操作

    论文中接着分析了其他网络模型违背了相应的原则方针,如下图所示:

    针对上述四条guidelines,论文提出shuffleNet V2的基本单元,如下图:

      (1) channel split然后concat,保证输入输出channel一致,遵循准则1?

       (2) 去掉1*1的分组卷积(channel split相当于分组了),遵循准则2

       (3) channel split和将channel shuffle移动到后面,遵循准则3?

       (4)利用concat代替add,遵循准则4

    最后shuffleNet V2的整体架构如下:

参考:https://baijiahao.baidu.com/s?id=1589005428414488177&wfr=spider&for=pc

最新文章

  1. 【原】iOS学习之NSDate在项目中的一些类目扩展
  2. 构建自己的PHP框架--实现Model类(3)
  3. jcl-over-slf4j log桥接工具简介
  4. 水果姐逛水果街Ⅱ codevs 3305
  5. windows磁盘分区
  6. 你所不了解的setTimeout
  7. python接口的调用方法
  8. bzoj2467: [中山市选2010]生成树
  9. 【PSR规范专题(1)】PSR-0+namespace+spl_autoload_register实现框架模型
  10. 【BZOJ 1791】 [Ioi2008]Island 岛屿
  11. Android开源滤镜 仿instagram
  12. 网站开发常用jQuery插件总结(七)背景插件backstretch
  13. Linux内核学习笔记1——系统调用原理【转】
  14. strut2.xml中result param详细设置
  15. Android studio 开发中 用git实现批量忽略特定文件的方法
  16. PDO LIMIT bug
  17. Gradle中文乱码
  18. HDU 1010Tempter of the Bone(奇偶剪枝回溯dfs)
  19. pentaho专题之reporting design入门指南
  20. iOS音频采集过程中的音效实现

热门文章

  1. Linux文件(夹)属性
  2. mycat-rule
  3. javascript遍历对象属性
  4. 《AlwaysRun!》第五次作业:项目需求分析改进与系统设计
  5. [Ynoi2017]由乃的OJ
  6. Tornado之Session实现
  7. re模块与正则
  8. python - scrapy 爬虫框架 ( 起始url的实现,深度和优先级,下载中间件 )
  9. 洛谷 P2615 神奇的幻方 题解
  10. Greenplum 调优--数据分布法则 - 分布列与分区的选择