轻量级模型:MobileNet V2

一、论文:

https://arxiv.org/abs/18

非官方Caffe代码:https://github.com/shicai/MobileNet-Caffe

二、论文理解

MobileNet V2 是对 MobileNet V1 的改进,同样是一个轻量级卷积神经网络。

1)基础理论--深度可分离卷积(DepthWise操作)

轻量级模型:MobileNet V2_第1张图片

标准的卷积过程可以看上图,一个2×2的卷积核在卷积时,对应图像区域中的所有通道均被同时考虑,问题在于,为什么一定要同时考虑图像区域和通道?我们为什么不能把通道和空间区域分开考虑?

轻量级模型:MobileNet V2_第2张图片

Xception网络就是基于以上的问题发明而来。我们首先对每一个通道进行各自的卷积操作,有多少个通道就有多少个过滤器。得到新的通道feature maps之后,这时再对这批新的通道feature maps 进行标准的1×1跨通道卷积操作。这种操作被称为“DepthWise convolution”,缩写“DW”。

这种操作是相当有效的,在 ImageNet 1000 类分类任务中已经超过了InceptionV3 的表现,而且也同时减少了大量的参数,我们来算一算,假设输入通道数为3,要求输出通道数为256,两种做法:

1. 直接接一个3×3×256的卷积核,参数量为:3×3×3×256 = 6,912

2. DW 操作,分两步完成,参数量为:3×3×3 + 3×1×1×256 = 795,又把参数量降低到九分之一!

因此,一个 Depthwise 操作比标准的卷积操作降低不少的参数量,同时论文中指出这个模型得到了更好的分类效果。

2)MobileNetV1遗留的问题

1、结构问题:

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

2、Depthwise Convolution的潜在问题:

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

3MobileNet V2的创新点

1、Inverted Residual Block

MobileNet V1没有很好的利用Residual Connection,而Residual Connection通常情况下总是好的,所以MobileNet V2加上。先看看原始的ResNet Block长什么样,下图左边:

轻量级模型:MobileNet V2_第3张图片

先用1x1降通道过ReLU,再3x3空间卷积过ReLU,再用1x1卷积过ReLU恢复通道,并和输入相加。之所以要1x1卷积降通道,是为了减少计算量,不然中间的3x3空间卷积计算量太大。所以Residual block是沙漏形,两边宽中间窄。

但是,现在我们中间的3x3卷积变为了Depthwise的了,计算量很少了,所以通道可以多一点,效果更好,所以通过1x1卷积先提升通道数,再Depthwise的3x3空间卷积,再用1x1卷积降低维度。两端的通道数都很小,所以1x1卷积升通道或降通道计算量都并不大,而中间通道数虽然多,但是Depthwise 的卷积计算量也不大。作者称之为Inverted Residual Block,两边窄中间宽,像柳叶,较小的计算量得到较好的性能。

2、ReLU6

首先说明一下 ReLU6,卷积之后通常会接一个 ReLU 非线性激活,在 MobileNet V1 里面使用 ReLU6,ReLU6 就是普通的ReLU但是限制最大输出值为 6,这是为了在移动端设备 float16/int8 的低精度的时候,也能有很好的数值分辨率,如果对 ReLU 的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的float16/int8无法很好地精确描述如此大范围的数值,带来精度损失。

本文提出,最后输出的 ReLU6 去掉,直接线性输出,理由是:ReLU 变换后保留非0区域对应于一个线性变换,仅当输入低维时ReLU 能保留所有完整信息。

在看 MobileNet V1的时候,我就疑问为什么没有把后面的 ReLU去掉,因为Xception已经实验证明了 Depthwise 卷积后再加ReLU 效果会变差,作者猜想可能是 Depthwise 输出太浅了, 应用 ReLU会带来信息丢失,而 MobileNet V1还引用了 Xception 的论文,但是在 Depthwise 卷积后面还是加了ReLU。在 MobileNet V2 这个 ReLU终于去掉了,并用了大量的篇幅来说明为什么要去掉。

总之,去掉最后那个 ReLU,效果更好。

4 网络结构

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

轻量级模型:MobileNet V2_第4张图片

 网络的整体配置清单如下:

轻量级模型:MobileNet V2_第5张图片

其中:

t  是输入通道的倍增系数(即中间部分的通道数是输入通道数的多少倍)

是该模块重复次数

c 是输出通道数

s 是该模块第一次重复时的 stride(后面重复都是 stride 1)

5 实验结果

通过 Inverted residual block这个新的结构,可以用较少的运算量得到较高的精度,适用于移动端的需求,在 ImageNet 上的准确率如下所示:

轻量级模型:MobileNet V2_第6张图片

可以说是又小又快又好。另外,应用在目标检测任务上,也能得到很好的效果。

应用在目标检测任务上,基于 MobileNet V2的SSDLite 在 COCO 数据集上超过了 YOLO v2,并且大小小10倍速度快20倍:

轻量级模型:MobileNet V2_第7张图片

6 总结

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

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

三、参考博客

MobileNet V2的Caffe模型:https://github.com/shicai/MobileNet-Caffe

Depthwise Convolutional Layer: github.com/yonghenglh6/DepthwiseConvolution

MobileNet-SSD: https://github.com/chuanqi305/MobileNet-SSD

知乎:https://www.zhihu.com/question/265709710/answer/298927545

你可能感兴趣的:(轻量级模型)