- 论文题目:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
- 论文链接:https://arxiv.org/abs/1704.04861
论文研究目标
提出了一种深度模型加速的算法,可以在基本不影响准确率的前提下大大减少计算时间和参数数量。为移动和嵌入式视觉应用提出了一种有效的解决方案。可以应用在目标检测、细粒度分类、人脸识别和大规模定位上。
创新点
- 将普通卷积层替换成深度可分离卷积(depthwise separable convolution)
- 提出了两个缩小超参数模型:
width multiplier
和resolution multiplier
MobileNet简介
虽然MobileNets在结构上与VGGNet类似,属于简单的流线型架构。但其使用深度可分离卷积层替换之前的全卷积层,以达到压缩参数数量并轻量化网络这一目标。
MobileNet除了第一层为全卷积层,其余层均为深度可分离卷积。不同于Deep Compression,因为网络在定义时结构简单,因此我们可以简单地搜索网络的拓扑结构,从头直接训练出一个效果很好的轻量化网络。
而MobileNet就是用来解决参数小和计算开销大的,采用的方法叫做深度可分离卷积。
算法结构
MobileNet的结构
MobileNet结构的定义如上图所示,除了最后的全连接层直接进行softmax分类,其余所有层之后都是批量正则化(BN层)和作为非线性激活函数的线性整流函数(ReLU层)。
下图比较了全卷积和深度可分离卷积(都跟着BN层和ReLU层)。通过有步长的逐深度卷积和第一层卷积,都能对图片进行空间上的下采样。最后一个平均池化层在全连接层之前,将特征图的空间分辨率降为1x1。将逐深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)算为不同的层,MobileNet有28层。
左图是标准卷积,右图是深度可分离卷积
MobileNet(V1)的精髓其实就是深度可分离卷积。
深度可分离卷积
MobileNet模型的核心就是深度可分离卷积,它是因式分解卷积的一种。
具体地,深度可分离卷积将标准化卷积分解为逐深度卷积(depthwise convolution)和逐点1x1卷积(pointwise convolution)。对于MobileNets,逐个深度卷积将单个滤波器应用到每一个输入通道。然后,逐点卷积用1x1卷积来组合不同深度卷积的输出。在一个步骤,一个标准的卷积过程将输入滤波和组合成一组新的输出。深度可分离卷积将其分成两层,一层用于滤波,一层用于组合。这种分解过程能极大减少计算量和模型大小。下图展示了如何将一个标准卷积分解为深度卷积和1×1逐点卷积。
标准卷积的分解过程
深度可分离卷积的参数量与计算量
MobileNet使用深度可分离卷积来破坏输出通道的数量和卷积核大小的相互作用。
标准的卷积运算,每次运算在滤波的同时,都涉及了所有输入通道特征的组合,从而产生新的特征。但是,滤波和组合步骤可以通过使用因式分解卷积(包括深度可分离卷积)分为两个步骤,以显著降低计算成本。
深度可分离卷积由两层构成:
- 逐层卷积
- 逐点卷积
我们使用逐层卷积对每个输入通道(输入特征图的深度)执行单个滤波器卷积。逐点卷积(1x1卷积)用来创建逐深度卷积层的线性组合。MobileNet对两层卷积层都使用了批量正则化(Batch Normalization , BN)和线性整流函数(ReLU)作为非线性激活函数。
逐层卷积可以被写作以下形式(每个输入通道一个滤波器):
指的是逐层卷积的卷积核,大小是
。
中的第
个滤波器作用于输入特征图
的第
个深度的特征,从而产生输出特征
的第
个通道。逐层卷积的计算复杂度为:
逐层卷积相对于标准的卷积效率极高,但他只是给输入通道做了个滤波,而不能结合各个通道的特征图生成新的特征。
所以为了生成这些新的特征,一个额外的,由1x1卷积构成的逐点卷积被运用在了MobileNet中。
深度可分离卷积,就是上述两种卷积层操作的组合。
MobileNets使用3x3的深度可分离卷积比标准的卷积减少了8-9倍的计算复杂度,而与此同时准确率只减少了一点点。
空间维度的因式分解不会节省大量的计算复杂度,因为相比于其他直接做因式分解的模型[3][4]深度可分离卷积计算复杂度很小。
算法效果分析
由之前的分析,若只考虑浮点数运算,则一组二维卷积核完成逐深度卷积的运算量为:
而随后的逐点1×1卷积的浮点运算量为:
综上,一次深度可分离卷积的总计算量为:
所以,深度可分离卷积与传统全卷积的总计算量之比为:
举一个例子,给定输入图像为3通道的224×224图像,VGG16网络的第三个卷积层conv2_1输入的是尺寸为112的特征图,通道数为64,卷积核尺寸为3,卷积核个数为128,传统卷积运算量就是:
如果将传统的全卷积替换为逐深度卷积加上1*1的逐点卷积,计算量为:
可见,在这一层里,MobileNet所采用的卷积方式的计算量与传统卷积计算量的比例为:
同理,我们也可以计算一个深度可分离卷积层相对于全卷积层的压缩比。传统的全卷积层由
个尺寸为
的三维卷积核组成,因此一个层的参数(不考虑偏置时)总量为
:
而对于深度可分离卷积,逐深度卷积由个的二维卷积核组成,因此参数总量为
。
之后紧跟的1×1逐点卷积的参数量则为
,因此一个深度可分离卷积的总参数量为:
所以,再输入输出通道数相同的情况下,使用深度可分离卷积替换全卷积的压缩比为:
可以发现,这个压缩比与计算量的压缩比是相同的,在深度网络中,
的取值往往远大于
(
)。因此,压缩比略小于9。在后续的实验中,确定基于深度可分离卷积MobileNet,相对于结构类似的VGG16网络的实际压缩比为8.4。
两个shrink超参数模型
width multiplier
尽管基本的MobileNet体系结构已经很小而且延迟很低,但是很多时候一个特定的用例或应用程序可能需要模型更小和更快。为了构建这些较小和较昂贵的模型计算我们介绍一个非常简单的参数α
称为宽度乘数。宽度乘数α
的作用是在每一层薄网络统一。对于给定的层宽度乘数α,输入通道数M变成αM,输出通道的数目N变成αN。公式如下:
α∈(0,1),其典型设置为{1,0.75,0.5和0.25}。
resolution multiplier
第二个hyper-parameter减少神经网络的计算成本是分辨率乘数ρ
。这给输入图像和内部表现的每一层随后都减少了相同的乘法器。在实践中我们隐式地设置ρ通过设置输入分辨率。我们现在可以把我们的网络的核心层的计算成本换成深度可分离卷积并与width multiplierα
和resolution multiplier乘数ρ
相结合:
ρ∈(0,1)通常设置隐式,以便网络的输入分辨率分别为{224,192,160,128}。
MobileNet模型训练过程:
- 使用tensorflow或pytorch
- 与inception v3相似的异步梯度下降
- 使用较少的正则和数据增强,因为小模型过拟合的概率不大。
- 我们不使用侧头或标签平滑
- 限制在inception中的小尺寸剪裁的数量。
- 权重衰减(l2正则化)使用较少或没有使用,因为该模型参数本来就不多。
在不同task上的结果
开源代码
https://github.com/Zehaos/MobileNet