原论文:MobileNetV2: Inverted Residuals and Linear Bottlenecks
MobileNet v2
1、四个问题
- 要解决什么问题?
- 与MobileNet v1所要解决的问题一样,为嵌入式设备或算力有限的场景下设计一个有效的模型。
- 用了什么方法解决?
- 一方面,沿用了再MobileNet v1中采用的depthwise separable convolution。
- 另一方面,新提出了inverted residual结构和linear bottleneck结构来改进模型。
- 效果如何?
- 作者在论文中给出了一系列任务下的实验结果:ImageNet图像分类、目标检测、语义分割等,MobileNet v2均取得了比MobileNet v1更好的效果。
- 就目标检测来说,由MobileNet v2扩展构建的网络,其性能相比于其他架构如:Faster-RCNN、RFCN等还是逊色不少,但是考虑到模型的实时性和计算量,MobileNet v2在各项任务的表现相比于同一量级的模型是state-of-the-art的。
- 还存在什么问题?
- 社区对其的评价普遍都挺高,但也有一些人说自己复现(基于TensorFlow的)无法达到论文中的精度。网上也有挺多开源的复现代码(基于Pytorch),用的时候还是自己复现一下再下定论吧。
2、论文概述
2.1、Depthwise Separable Convolutions
- 基本思想就是:讲一个普通的卷积操作拆分成两个卷积操作。第一层为depthwise卷积,分别对每个输入通道进行卷积;第二层是pointwise卷积,实质就是 1 × 1 1 \times 1 1×1卷积,主要是用来将前面depthwise输出的特征组合起来构建新的特征。
2.2、Linear Bottlenecks
- 文中,经过激活层后的张量被称为manifold of interest(看到网上将其翻译为兴趣流形,总觉得有点不到位,所以后面都直接用英文代替)。
- 在manifold of interest(经过ReLU后的张量)非0的情况下,ReLU只是一个线性变换。
- ReLU只有在input manifold处于输入空间的子空间的情况下,才能保留input manifold的全部信息。
- 换句话说,只要使用了ReLU,就不可避免地要损失该通道内的一部分信息。
- 文中还给了一个示例,将input先映射到高维空间然后接一个ReLU后再还原回原来的维度。
- 示意图如下,可以看出映射的维度越高,还原的效果越好,保留的原始信息越多。
- 一句话概括:Linear Bottlenecks就是,去掉ReLU,减小对特征的破坏,尽可能保留输入的信息。
- Linear Bottlenecks后面会与Inverted residuals组合起来使用。
2.3、Inverted residuals
- 网络结构基本单元的演变,如下图所示:
- a就是普通的 3 × 3 3 \times 3 3×3卷积。
- b是Depthwise Separable Convolution操作,此前用于MobileNet v1.
- c由b扩展而来,在b后面加了linear bottleneck(虚线框),bottleneck层没有加ReLU。
- d与c很像,在堆叠网络时两者是等价的。
- 普通的residual block与inverted residual block之间的对比:
- 每个长方体的厚度象征着通道数。
- a为传统的residual block。结构为: 1 × 1 1 \times 1 1×1卷积(降维)+ReLU–> 3 × 3 3 \times 3 3×3卷积+ReLU–> 1 × 1 1 \times 1 1×1卷积(升维)+ReLU。
- b为反转的residual block(inverted residual block)。结构为: 1 × 1 1 \times 1 1×1卷积(升维)+ReLU–> 3 × 3 3 \times 3 3×3depthwise separable卷积+ReLU–> 1 × 1 1 \times 1 1×1卷积(降维)(注意,这里是不带ReLU的,即前面提到的linear bottleneck)。
2.4、模型结构
- Bottleneck residual block的结构(也就是inverted residual block),其为MobileNet v2的基本组成模块。
- MobileNet v2的总体结构:
- 几种网络的基本模块之间的对比:
2.5、其他
- 图a中可以看出,使用Linear bottleneck(不使用ReLU)比直接给输出接上ReLU6的效果好。
- 我个人的理解:
- ReLU会使负值置0,所以使用ReLU一定会出现信息损失。
- 一般情况下,普通卷积后接上ReLU应该是能取得更好地效果的,不然也不会这么多人这么用。
- 然而,针对MobileNet这个网络,由于其使用了大量的Depthwise Separable卷积,在Depthwise卷积之后接上ReLU就更容易损失信息了,导致效果反倒下降了。
- 为什么呢?因为Depthwise卷积是直接针对单通道的,也就是说它的输出是单通道的,而这种单通道的信息经过ReLU后更容易损失信息。前面在讨论Linear Bottleneck时,作者也提到了如果中间层的维度较低,再经过ReLU后(manifold of interest)则很容易损失信息,除非先升高到一个较高维度再降低回原来的维度,才能保留更多的信息。而普通卷积则会将各个输入通道的输出加权求和,这一点也类似于提升了维度,所以直接接上ReLU并不会损失太多信息。
- 我个人的理解:
- 图b中可以看出,在bottleneck处添加shortcut会比在expanded layer处添加shortcut效果更好。