Google:Inception&MobileNets

Google:Inception&MobileNets

ResNet网络学习;整理Google的Inception V1到V4模块,参考文章:大话CNN经典模型;阅读《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》的总结

ResNet

之前接触过ResNet网络,不过老师作业中给了另一个学习视频,所以这里再进行一下学习整理

残差

  • 在传统的卷积神经网络中,CNN其实就是一个函数拟合的过程,对于输入x,通过CNN这样一个复合函数,来得到预测输出 \(\hat y\)

  • 不过随着网络深度的增加,会出现网络退化,导致学习能力下降,难以得到预期的函数效果H(x)

  • 不过发现,如果让网络学习达到F(x) = H(x) - x的函数效果(Residual,残差)则会容易许多

  • 而最终我们预期得到的H(x)通过H(x) = F(x) + x得到

  • Google:Inception&MobileNets_第1张图片

  • 其中右侧x直接连接到下一层输入,称之为恒等映射(短接)

网络结构

  • Google:Inception&MobileNets_第2张图片

  • 常见的ResNet一般由5个stage组成,每个stage又包含若干个block,每个block中包含多个卷积层

  • 通过这样的结构划分,可以增加代码的可扩展性

  • 在最后一层,设置了一个Global Average pool

    • 用来替代全连接层
    • 参数更少,避免出现过拟合
  • 在网络的50层结构以上的时候会出现Bottle Neck(瓶颈)

    • Google:Inception&MobileNets_第3张图片

    • 在入口处通过1x1卷积,来进行降维操作。出口处通过1x1卷积,再恢复原有维度数

    • 通过这样的形式来减少参数量和计算量

  • 在跟着视频学习的时候,也跟着老师一起手敲了一遍ResNet的模型搭建代码,感觉还是收获很多的,之前一直是看一些现成的网络模型代码,感觉能看懂就不再进一步钻研了,而当自己去亲手敲代码的时候才明白自己的不足之处——所谓“纸上得来终觉浅,绝知此事要躬行”吧!!

Inception

原始的Inception结构

Google:Inception&MobileNets_第4张图片

这是Google提出的原始的Inception模块,输入通过不同的卷积和池化操作,然后在将每部分的结果进行堆叠,得到输出。具体实例如下:

Google:Inception&MobileNets_第5张图片

  • 其中不同的卷积核操作之后,得到的feature map的尺寸大小是不一样的,然后对其进行padding操作恢复原来尺寸大小,再将多个卷积核的操作结构进行堆叠即可
  • 同时在每一个卷积层之后都要进行ReLU操作,增加非线性的拟合能力
  • 通过这种操作,有两方面好处
    • 增加了网络的宽度
    • 增加了网络对尺度的适应性
  • 不过也存在着问题,即在多个Inception模块后,输出的feature map会十分厚,导致计算量增大。

Inception V1

为解决上述问题,通过在3x3前、5x5前以及max pooling后分别加上了1x1的卷积核,来达到降维的目的。

Google:Inception&MobileNets_第6张图片

Google:Inception&MobileNets_第7张图片

比如,上一层的输出为100x100x128,经过具有256个通道的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256,其中,卷积层的参数为128x5x5x256= 819200。而假如上一层输出先经过具有32个通道的1x1卷积层,再经过具有256个输出的5x5卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,大约减少了4倍。

Inception V2

  • 卷积分解

    • 感受野的越大,那么在卷积的过程中,便能够同时捕获更多的图像信息,不过相应的参数量也会较大(5x5的卷积核的参数为25个)。因此Google提出了一种卷积分解的方法。

    • Google:Inception&MobileNets_第8张图片

      • 5x5的图像块,通过5x5的卷积核可以直接得到最终对应的feature map。参数个数为25
      • 5x5的图像块,先通过3x3的卷积核得到3x3的feature map,然后再进行一次卷积得到最终的feature map。参数个数为9+9=18
      • 同时大量实验表明,这种替换方案并不会造成表达缺失
    • Google:Inception&MobileNets_第9张图片

      • 同时,任意nxn的卷积都可以通过1xn卷积后接nx1卷积来替代

      • 在中度大小的特征图(feature map)上使用效果才会更好(特征图大小建议在12到20之间)

    • 因此原有的一个1x1→5x5卷积核

      • 可以先分解成1x1→3x3→3x3
      • 然后进一步分解得到1x1→1x3→3x1→1x3→3x1
  • 降低feature map大小

    • 先卷积,再池化
      • 这样操作,虽然保留了特征信息,但在本层的计算量并没有减少
    • 先池化,再卷积
      • 先进行池化操作,可能会导致部分特征消失
    • 为了同时保持特征表示且降低计算量,使用以下结构(使用两个并行化的模块来降低计算量(卷积、池化并行执行,再进行合并))
      • Google:Inception&MobileNets_第10张图片

Inception V3

对卷积核进行分解,增加网络深度,同时每增加一层都要进行ReLU操作,增加网络的非线性(增加非线性激活函数使网络产生更多独立特征,表征能力更强,训练更快)。

Inception V4

  • 将Inception模块与ResNet的残差相结合。

  • 利用残差结构来进一步改进Inception V3

  • 原始残差结构

    • Google:Inception&MobileNets_第11张图片
  • 与Inception相结合

    • Google:Inception&MobileNets_第12张图片

MobileNets

学习阅读了《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》,然后整理一下学习的主要内容。

简述

文章中介绍的MobileNets基于流线型架构,使用深度可分离的卷积(depthwise separable convolutions)来构建轻量级深度神经网络。

文章介绍了一种网络结构和两种超参数,从而构建一个小规模、低延迟的模型,从而应用于各种特定的场景中。

MobileNets框架

深度可分离卷积(Depthwise Separable Conv)

在MobileNet中,将传统的标准卷积进行分解,得到一个深度卷积(depthwise convolution)和一个1x1的点卷积(pointwise convolution)。其实现原理可以理解为是一种矩阵的因式分解。在进行深度卷积的时候,每个卷积核只在一个对应的channel上进行卷积操作,接着在点卷积的过程中,将卷积操作后的channel进行组合操作。

Google:Inception&MobileNets_第13张图片

这是论文中的图例,我在网上找到了更好理解的图示

Google:Inception&MobileNets_第14张图片

  • 假如当前输入为19x19x3
  • 标准卷积:3x3x3x4(stride = 2, padding = 1),那么得到的输出为10x10x4
  • 深度可分离卷积:
    • 深度卷积:3x3x1x3(3个卷积核对应着输入的三个channel),得到10x10x3的中间输出
    • 点卷积:1x1x3x4,得到最终输出10x10x4
  • 一个标准的卷积层以\(D_F * D_F * M\)大小的feature map F作为输入,然后输出一个\(D_G * D_G * N\)的feature G
    • 卷积核K的参数量为
      • \(D_K * D_K * M * N\)
    • 标准卷积的计算量为
      • \(D_K * D_K * M * N * D_F * D_F\)
    • 深度可分离卷积的计算量为
      • \(D_K * D_K * M * D_F * D_F + M * N * D_F * D_F\)
  • MobileNet使用了大量的3 × 3的深度可分解卷积核,极大地减少了计算量(1/8到1/9之间),但准确率下降的很小

网络结构和训练

Google:Inception&MobileNets_第15张图片

MobileNet第一层采用标准卷积,其它层均采用文章中 提出的深度可分解卷积。每一层后面跟着一个batchnorm和ReLU非线性激活函数,除了最后一层全连接层。在最后的全连接层之后直接输入到softmax层进行分类。网络中的下采样操作是采用带stride的卷积实现的。

Google:Inception&MobileNets_第16张图片

上图对比了标准卷积与深度可分解卷积的结构。

在MobileNet中95%的计算时间用于有75%的参数的1×1点卷积。

宽度因子(Width Multiplier: Thinner Models)

  • 宽度乘数α的作用是将每一层的网络宽度变瘦
  • \(\alpha\)是一个属于(0,1]之间的数,附加于网络的通道数
  • 对于一个给定的层和一个宽度乘数\(\alpha\),输入通道M变成\(\alpha\)M,输出通道N变成\(\alpha\)N
  • \(\alpha\)常用的配置为1,0.75,0.5,0.25;当\(\alpha\)等于1时就是标准的MobileNet
  • 通过参数\(\alpha\)可以非常有效的将计算量和参数量减少到原来的\(\alpha^2\)倍。计算量为
    • \(D_K * D_K * \alpha M * D_F * D_F + \alpha M * \alpha N * D_F * D_F\)

分辨率因子(Resolution Multiplier: Reduced Representation)

  • 分辨率乘数用来改变输入数据层的分辨率
  • 将其应用于输入图像,然后通过相同的乘数来减少每一层的内部表示
  • \(\rho\)∈(0,1]通常是隐式设置的,因此网络的输入分辨率为224、192、160或128
  • \(\rho\) = 1是基准MobileNet,而\(\rho\)<1是简化的计算MobileNets
  • 可以有效的将计算量和参数量减少到原来的\(\rho^2\)倍。与宽度因子结合,其计算量为
    • \(D_K * D_K * \alpha M * \rho D_F * \rho D_F + \alpha M * \alpha N * \rho D_F * \rho D_F\)

\(\alpha\)\(\rho\)都小于1,可以构建更少参数的mobilenet。下面是一个具体参数设置下,网络计算量和参数数目的变化情况。

Google:Inception&MobileNets_第17张图片

实验

使用相同的MobileNet的架构,在使用可分离卷积的情况下,其精度值略有下降(下降了1%),但其所hi用的参数量仅为1/7。

Google:Inception&MobileNets_第18张图片

Model Choices

在面对“是更浅的网络更好,还是更瘦的网络更好呢?”这样的问题的时候,作者设计了参数和计算量相近的两个网络进行了比较,其结论是相对而言。

Google:Inception&MobileNets_第19张图片

alpha和rho的定量影响

Google:Inception&MobileNets_第20张图片

可以看到,超参数\(\alpha\)减小的时候,模型准确率随着模型的变瘦而下降。

Google:Inception&MobileNets_第21张图片

超参数\(\rho\)减小的时候,模型准确率随着模型的分辨率下降而下降。

能够看出来,两个超参数的引入,都会导致模型准确率的下降,降低MobileNet的性能表现,不过更重要的是在计算量和准确率之间、模型大小和准确率之间的一个取舍和权衡。

你可能感兴趣的:(Google:Inception&MobileNets)