- 论文题目: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)作为非线性激活函数。
逐层卷积可以被写作以下形式(每个输入通道一个滤波器):
深度可分离卷积,就是上述两种卷积层操作的组合。
MobileNets使用3x3的深度可分离卷积比标准的卷积减少了8-9倍的计算复杂度,而与此同时准确率只减少了一点点。
空间维度的因式分解不会节省大量的计算复杂度,因为相比于其他直接做因式分解的模型[3][4]深度可分离卷积计算复杂度很小。
算法效果分析
由之前的分析,若只考虑浮点数运算,则一组二维卷积核完成逐深度卷积的运算量为:
两个shrink超参数模型
width multiplier
resolution multiplier
第二个hyper-parameter减少神经网络的计算成本是分辨率乘数ρ
。这给输入图像和内部表现的每一层随后都减少了相同的乘法器。在实践中我们隐式地设置ρ通过设置输入分辨率。我们现在可以把我们的网络的核心层的计算成本换成深度可分离卷积并与width multiplierα
和resolution multiplier乘数ρ
相结合:
MobileNet模型训练过程:
- 使用tensorflow或pytorch
- 与inception v3相似的异步梯度下降
- 使用较少的正则和数据增强,因为小模型过拟合的概率不大。
- 我们不使用侧头或标签平滑
- 限制在inception中的小尺寸剪裁的数量。
- 权重衰减(l2正则化)使用较少或没有使用,因为该模型参数本来就不多。
在不同task上的结果