轻量级网络-------mobilenet_v2总结

  • 原文:Inverted Residuals and Linear Bottlenecks Mobile Networks for Classification, Detection and Segmentation
  • 中心思想: Depthwise Separable Convolution和Residual Connection的结合
  • 代码:https://github.com/tonylins/pytorch-mobilenet-v2/blob/master/MobileNetV2.py

1.动机

MobileNet_v2的动机是解决MobileNet_v1的遗留问题,下面总结一下MobileNet_v1存在的问题

  • 结构问题:

MobileNet1.0 的结构其实非常简单, 论文里头是一个非常复古的直筒结构, 类似于VGG一样。 这种结构的性价比其实不高, 后续一系列的ResNet, DenseNet等结构已经证明通过复用图像特征, 使用concat/eltwise+ 等操作进行融合, 能极大提升网络的性价比。

  • Depthwise Convolution 的潜在问题:

Depthwise Conv确实是大大降低了计算量, 而且NxN Depthwise + 1X1 PointWise的结构在性能上也能接近NxN Conv。 在实际使用的时候,发现Depthwise 部分的kernel比较容易训废掉: 训完之后发现depthwise训出来的kernel有不少是空的... 当时我们认为是因为depthwise每个kernel dim 相对于vanilla conv要小得多, 过小的kernel_dim, 加上ReLU的激活影响下, 使得神经元输出很容易变为0, 所以就学废了: ReLU对于0的输出的梯度为0, 所以一旦陷入了0输出, 就没法恢复了。 我们还发现,这个问题在定点化低精度训练的时候会进一步放大。

在MobileNetV2中我们也看到了Google在这点上类似的解释, 用ReLu中不同的Output/dim比值,对特征的分部空间可视化来直观解释特征/神经元退化问题。

分离卷积背后的假设是跨channel相关性和跨spatial相关性的解耦。

2.创新点

2.1 Linear Bottlenecks
当channel的个数比较少的时候,所有的信息都集中在比较窄的channel中,这这时候进行非线性激活比如RELU,会丢失很多信息。而在MobileNet V1中引入的一个超参数width multiplier会缩减channel,这样看起来就像一个瓶子的颈部一样。这种情况下用RELU激活机会丢失掉不少信息。

上图是作者展示用RELU激活时,当channel越小,丢失的信息越多,当channel越大,丢失的信息越少。其实不难理解,当channel为2时,信息都集中在这两个channel中,如果有部分数值小于0就会被RELU激活丢失掉。而如果channel为30,其实信息是分散的,而且具有了冗余,所以通过RELU激活后归于0的值可能并不会影响太多信息的存储。

所以作者建议对于channel数很少的那些层做线性激活。bottlenect就表示缩减的层,linear bottleneck表示对channel缩减的层做线性激活。如果要用RELU激活需要先增加channel数再做RELU激活。

2.2 Inverted residuals(锥形残差)
因为channel比较少的tensor信息特别集中,而且使用非线性激活会损失信息,所以作者想到对channel比较少的tensor进行channel的扩张。而残差block是先进行channel缩减,然后扩张,这样可能会丢失信息。作者就想到了一种倒置的残差block,先进行channel扩张,然后进行channel缩减。如下图显示对比,虚线的tensor后进行线性激活,这种倒置残差block是作者对残差block提出的一个改进。

轻量级网络-------mobilenet_v2总结_第1张图片

如上图,进行channel扩张后分离卷积的步骤由两步变成了三步,第一步就是将channel k扩张为tk,后面两步就是正常的深度分离卷积。

 

你可能感兴趣的:(轻量级网络)