论文原文

https://arxiv.org/pdf/1801.04381.pdf
mobilenet-v1我已经写过一篇论文阅读笔记了,地址在这里:https://blog.csdn.net/just_sort/article/details/79901885

MobileNet-V2的来源

Mobilenet-V1的出现推动了移动端的神经网络发展。但MobileNet V1主要使用的Depthwise Conv(深度可分离卷积)虽然降低了9倍的计算量,但遗留了一个问题是我们在实际使用的时候训练完发现kernel有不少是空的。当时我们认为,Depthwise每个kernel dim相对于普通Conv要小得多,过小的kernel_dim, 加上ReLU的激活影响下,使得神经元输出很容易变为0,所以就学废了。ReLU对于0的输出的梯度为0,所以一旦陷入0输出,就没法恢复了。我们还发现,这个问题在定点化低精度训练的时候会进一步放大。所以为了解决这一大缺点,MobileNet-V2横空出世。

MobileNet-V2的创新点

  • Inverted Residual Block,MobileNet V1没有很好的利用Residual Connection,而Residual Connection通常情况下总是好的,所以MobileNet V2加上。先看看原始的ResNet Block长什么样,下图左边:
    在原始的残差模块中,我们先用1x1降通道过ReLU,再3x3空间卷积过ReLU,再用1x1卷积过ReLU恢复通道,并和输入相加。之所以要1x1卷积降通道,是为了减少计算量,不然中间的3x3空间卷积计算量太大。所以Residual block是沙漏形,两边宽中间窄。
    而MobileNetV2提出的残差模块的结构如上图右边所示:中间的3x3卷积变为了Depthwise的了,计算量很少了,所以通道可以多一点,效果更好,所以通过1x1卷积先提升通道数,再Depthwise的3x3空间卷积,再用1x1卷积降低维度。两端的通道数都很小,所以1x1卷积升通道或降通道计算量都并不大,而中间通道数虽然多,但是Depthwise 的卷积计算量也不大。本文叫做为Inverted Residual Block,两边窄中间宽,使用较小的计算量得到较好的性能。
  • ReLU6,首先说明一下ReLU6,卷积之后通常会接一个ReLU非线性激活函数,在MobileNet V1里面使用了ReLU6,ReLU6就是普通的ReLU但是限制最大输出值为6,这是为了在移动端设备float16/int8的低精度的时候,也能有很好的数值分辨率,如果对ReLU的激活函数不加限制,输出范围0到正无穷,如果激活函数值很大,分布在一个很大的范围内,则低精度的float16/int8无法很好地精确描述如此大范围的数值,带来精度损失。论文提出,最后输出的ReLU6去掉,直接线性输出。理由是:ReLU变换后保留非0区域对应于一个线性变换,仅当输入低维时ReLU能保留所有完整信息。

网络结构

这样,我们就得到 MobileNet V2的基本结构了,左边是 V1 的没有 Residual Connection并且带最后的 ReLU,右边是 V2 的带Residual Connection 并且去掉了最后的 ReLU:

网络的整体配置清单如下:
其中, t t t是输入通道的倍增系数(即是中间部分的通道数是输入通道数的多少倍), n n n是该模块的重复次数, c c c是输出通道数, s s s是该模块第一次重复时的stride(后面重复都是stride等于1)。

实验和数据对比

通过 Inverted residual block这个新的结构,可以用较少的运算量得到较高的精度,适用于移动端的需求,在 ImageNet 上的准确率如下所示:
可以看到MobileNetV2又小又快,且在目标检测任务上,也取得了十分不错的结果。基于MobileNet V2的SSDLite在COCO数据集上超过了YOLO V2,且模型大小小10倍,速度快20倍。

总结和展望

1、CNN 在 CV 领域不断突破,但是深度模型前端化还远远不够。目前 MobileNet、ShuffleNet参数个位数(单位 M ),在ImageNet 数据集上,依 top-1 而论,比 ResNet-34,VGG19 精度高,比 ResNet-50 精度低。实时性和精度得到较好的平衡。

2、本文最难理解的其实是 Linear Bottlenecks,论文中用了很多公式来描述这个思想,但是实现上非常简单,就是在 MobileNet V1 微结构(bottle_neck)中第二个PW后去掉 ReLU6。对于低维空间而言,进行线性映射会保存特征,而非线性映射会破坏特征。

Caffe实现

https://github.com/shicai/MobileNet-Caffe

Keras代码实现

https://github.com/xiaochus/MobileNetV2

参考文章

https://blog.csdn.net/kangdi7547/article/details/81431572