本文基于MobileNetV1(戳这可以先了解一下MobileNetV1)的缺陷提出了MobileNetV2结构,并且详尽地分析介绍了设计轻量网络中的一些方法。参考ResNet的跳跃连接,作者提出Linear Bottlenecks和Inverted residuals模块去对网络进行优化,使得网络变得更快。
① 目前,很多达到最好效果的网络都需以消耗大量的计算资源为代价的,并不适用于嵌入式移动设备。
② MobileNetV1虽然轻盈,但是其准确率表现不大如意,原因是单纯地使用卷积层进行堆叠,没有引入类似于跳跃连接的结构,所以没有充分利用图像的信息。
③ 在实际使用中,发现深度可分离卷积的某些卷积核参数为0,也就是在学习过程中导致卷积核“失效了”。
为了解决学习过程中卷积核参数变0的问题,作者进行了分析,认为是由于Dwise的浅层输出接ReLU6(代表最大的激活值为6)容易使得卷积核参数为0,损害了信息(关于ReLU,很多文章指出过,在某些情况下会损失精度)。作者给出了如下图:
随着卷积输出维度的越来越高,output能够越来越接近input。而维度很小的时候,只有显示了一部分,所以有一部分被ReLU6吃掉了。通作者过如下图改进:
在stride=1或者stride=2的bottleneck的Dwise输出,都通过使用线性而不是非线性ReLU6以减少信息的丢失。使用非线性的bottleneck会有一定的提升,作者给出的对比图如下:
可见使用非线性输出的bottleneck准确率更高。
为了引入跳跃连接,作者参考ResNet的设计,在设计Bottleneck Residual Block的时候使用了 Residual Block,并且从以下方面进行对Residual Block的改造:
① 继承MobileNetV1,使用可分离深度卷积,这是使得模型轻量化的一个重要手段。如下图的(a)和(b)。
② 通道数的扩展,由于上面已经提到当使用可分离卷积的时候,如果要引入非线性ReLU6,那么就要使得通道数增加才能减小ReLu6带来的影响。如下图:
左边图像通过1x1卷积将通道数尽量增加,经过分离卷积以后恢复成原来的通道。
③ 引入线性输出,上面提过,由于ReLU6非线性输出的影响,所以在卷积后的1x1卷积输出使用线性输出,而不添加ReLU6。
④ 引入跳跃连接,名为Inverted residual block,之所以叫Inverted,是因为其不同于平常的residual block。两者对比如下图:
(a)为residual block模块,跳线连接之间,通道数是少的,呈“两边多,中间小”。而(b)则是为了尽量使ReLU6能够更好与深度可分离卷积兼容,所以在条线之间的通道数是最多的,而两边的通道则比中间小。呈“两边少,中间多”。所以作者称其为Inverted residual block。
下图显示使用Inverted residual block的bottleneck(也就是“中间多,两边小”)的结构会由更高的准确率,如果没有残差块,则其准确率更低。
总的结构图如下图:
其中,t扩增因子,一般与输入的通道数相乘;c代表输出通道数;n代表bottleneck的个数;s表示的为stride。stride为1的bottleneck和stride为2的bottleneck区别如下图:
作者还通过改进目标检测SSD网络(使用深度可分离卷积代替常规卷积)叫SSDLite。改进以后的参数确实减少不少,如下图:
作者又通过组合MobileNet(MNet)和SSDLite进行对比,如下图:
作者还进行了各种网络使用Google Pixel 1 phone运行的参数、运行速度和准确率的对比。如下图:
下图为MobileNetV2在PASCAL VOC2012数据集上的分割效果,OS为output_stride;S为single scale,单尺度;MS+F:为Multi-scale inputs with scales = {0.5, 0.75, 1, 1.25, 1.5, 1.75} and left-right flipped inputs,经过多尺度处理和左右翻转处理的输入。
① 提出一个更轻量的网络,准确率高。
② 作者提出的这种改进模型效率的思路非常实用,如深度可分离卷积。这些思路可以用于改进当前表现好但是计算复杂的模型。
(占位)
(1)论文链接:https://arxiv.org/abs/1801.04381
(2)如何评价mobilenet v2 ?