文章:https://arxiv.org/abs/1704.04861
代码:https://github.com/tensorflow/models/tree/master/research/slim/nets
https://github.com/Zehaos/MobileNet
MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
谷歌出品
1 摘要
作者提出了一类称为MobileNets的高效模型,用于移动和嵌入式视觉应用。MobileNets基于流线型架构,使用深度可分离卷积来构建轻量级深度神经网络。我们介绍了两个简单的全局超参数,可以有效地在延迟和准确性之间进行权衡。这些超参数允许模型构建者根据问题的约束为其应用选择合适大小的模型。我们提供了有关所需资源和准确性权衡的广泛实验,并且与ImageNet分类上的其他流行模型相比显示出强大的性能。然后,我们展示了MobileNets在各种应用和用例中的有效性,包括对象检测,细粒度分类,面部属性和大规模地理定位。
2 简介
自从AlexNet 通过赢得ImageNet ILSVRC 2012挑战以来,卷积神经网络已经在计算机视觉中无处不在。总的趋势是制造更深和更复杂的网络以实现更高的准确性。然而,这些提高准确度的进步并不一定使网络在尺寸和速度方面更有效。在许多现实世界的应用中,例如机器人,自动驾驶汽车和增强现实,识别任务需要在计算有限的平台上实时进行。
本文描述了一种高效的网络架构和一组两个超参数,以便构建非常小、低延迟的模型,可以轻松地匹配移动和嵌入式视觉应用的设计要求。
第2节回顾了建立小型模型的先前工作。第3节描述了MobileNet架构和两个超参数宽度乘法器和分辨率乘法器,以定义更小、更高效的MobileNets。第4节描述了ImageNet上的实验以及各种不同的应用程序和用例。第5节是本文总结。
3 先前工作
在最近的文献中,人们越来越关注构建小型高效的神经网络。许多不同的方法通常可以分为压缩预训练网络或直接训练小网络。本文提出了一类网络体系结构,允许模型开发人员专门选择与其应用程序的资源限制(延迟,大小)匹配的小型网络。MobileNets主要专注于优化延迟,同时也得到了小型网络。许多论文只关注模型大小但不考虑速度。
MobileNets主要由最初在[26]中引入的深度可分离卷积构建,随后在Inception模型[13]中使用,以减少前几层中的计算。扁平化网络[16]利用完全分解的卷积构建网络,并展示了极其分解网络的潜力。独立于当前的论文,Factorized Networks [34]引入了类似的因式化卷积以及拓扑连接的使用。随后,Xception网络[3]演示了如何扩展深度可分离卷积超越Inception V3网络。另一个小型网络是Squeezenet [12],它使用瓶颈方法设计一个非常小的网络。其他减少计算的网络包括结构化变换网络[28]和Deep fried卷积网络[37]。
获得小型网络的另一种方法是缩减、分解或压缩预训练网络。压缩包括乘积量化、哈希、剪枝、向量量化和霍夫曼编码。另外,已经提出了各种因式分解以加速预训练网络。训练小型网络的另一种方法是蒸馏[9],它使用更大的网络来教授更小的网络,它是我们方法的补充,在第4节的一些用例中有所介绍。
4 MobileNet网络结构
在本节中,我们首先描述构建MobileNet的核心层 — 深度可分离的滤波器。然后,我们描述了MobileNet网络结构,并总结了两个模型收缩超参数 — 宽度乘数和分辨率乘数的描述。
4.1 深度可分离卷积
MobileNet模型基于深度可分离卷积,这是一种因式化卷积形式,它将标准卷积分解为逐层卷积和逐点卷积两部分。对于MobileNets,逐层卷积是将单个滤波器应用于每个输入通道。**然后,逐点卷积应用1×1卷积来组合逐层卷积的输出。**这种因子分解具有显著减少计算量和模型大小的效果。下图展示了一个标准卷积是如何分解为一个深度可分卷积和一个1 * 1逐点卷积。
- 标准卷积:
输入:大小为 D F × D F × M D_F \times D_F \times M DF×DF×M的feature map F, D F D_F DF是宽高,M是输入的通道数;
输出:大小为 D G × D G × N D_G \times D_G \times N DG×DG×N的feature map G, D G D_G DG是宽高,N是输出的通道数;
卷积核:大小为 D K × D K × M × N D_K \times D_K \times M \times N DK×DK×M×N的卷积核K, D K D_K DK是卷积核的宽高,M对应输入通道数,N对应输出通道数;
计算过程:假设stride为1, G k , l , n = ∑ i , j , m K i , j , m . F k + i − 1 , l + j − 1 , m G_{k,l,n} = \sum_{i,j,m}K_{i,j,m} . F_{k+i-1,l+j-1,m} Gk,l,n=∑i,j,mKi,j,m.Fk+i−1,l+j−1,m;
计算量: D K × D K × M × N × D G × D G D_K \times D_K \times M \times N \times D_G \times D_G DK×DK×M×N×DG×DG;
作用:卷积核过滤输入 + 组合过滤输出产生新特征。
标准卷积操作具有基于卷积核过滤特征并组合特征以产生新表示的效果,普通卷积同时考虑了图像的空间区域信息和通道信息。通过使用深度可分卷积,可以将滤波和组合步骤分成两个步骤且大幅度减少计算量。 - 深度可分卷积:
深度可分离卷积由两层组成:逐层卷积和逐点卷积。
我们使用逐层卷积在输入的depth维度上为每个输入channel应用单个滤波器;然后使用简单的1×1卷积的逐点卷积来创建逐层卷积的输出的线性组合。MobileNets中在逐层卷积和逐点卷积之后都使用batchnorm和ReLU。
逐层卷积:
逐层卷积是对输入depth方向上的每一个channel应用单独的卷积核,可以写作:
输入:大小为 D F × D F × M D_F \times D_F \times M DF×DF×M的feature map F, D F D_F DF是宽高,M是输入的通道数;
输出:大小为 D F × D F × M D_F \times D_F \times M DF×DF×M的feature map G, D G D_G DG是宽高,M是输出的通道数;
卷积核: K ^ \hat K K^表示大小为 D K × D K × M D_K \times D_K \times M DK×DK×M的卷积核族;
计算过程: G ^ k , l , m = ∑ i , j K ^ i , j , m . F k + i − 1 , l + j − 1 , m \hat G_{k,l,m} = \sum_{i,j} \hat{K}_{i,j,m} . F_{k+i-1,l+j-1,m} G^k,l,m=∑i,jK^i,j,m.Fk+i−1,l+j−1,m,,将 K ^ \hat K K^的第m个卷积核应用到输入F的第m个通道可以产生输出 G ^ \hat G G^的第m个通道;
计算量: D K × D K × M × D G × D G D_K \times D_K \times M \times D_G \times D_G DK×DK×M×DG×DG;
作用:通道间相互独立,没有各通道间的特征融合。逐层卷积由于只在通道间进行卷积,导致输入与输出特征图的通道数相同,无法改变通道数。
逐点卷积:
逐点卷积是对输入特征的每一点处应用N个不同的卷积核,可以写作:
输入:大小为 D F × D F × M D_F \times D_F \times M DF×DF×M的feature map G ^ \hat G G^, D F D_F DF是宽高,M是输入的通道数;
输出:大小为 D G × D G × N D_G \times D_G \times N DG×DG×N的feature map G, D G D_G DG是宽高,M是输出的通道数;
卷积核:N个大小为 1 × 1 × M 1 \times 1 \times M 1×1×M的卷积核族;
计算过程:在输入数据的每一点处进行N次大小为 1 * 1 ,depth为M的卷积;
计算量: D G × D G × M × N D_G \times D_G \times M \times N DG×DG×M×N;
作用:融合不同通道间的特征,并且可以改变输出特征的通道数。
- 计算量对比:
深度可分卷积和标准卷积的计算量比值为: D K × D K × M × D G × D G + D G × D G × 1 × 1 × M × N D K × D K × M × N × D G × D G = 1 N + 1 D K 2 \frac{D_K \times D_K \times M \times D_G \times D_G + D_G \times D_G \times 1 \times 1 \times M \times N}{D_K \times D_K \times M \times N \times D_G \times D_G} \ = \frac{1}{N} + \frac{1}{D_K^2} DK×DK×M×N×DG×DGDK×DK×M×DG×DG+DG×DG×1×1×M×N =N1+DK21
MobeilNet中使用大小为 3 * 3的卷积核,因此使用深度可分卷积的计算量是标准卷积的 1/8 - 1/9,但准确率如第四节所示只有微小损失。
深度可分离卷积的理解可以参考:https://zhuanlan.zhihu.com/p/65377955
逐层卷积的pyTorch实现:
通过conv2d的group参数进行实现,核心在于逐层的卷积,需要设置输出channel数和输入channel数一致,且group的数目也等于输入channel数。group表示卷积时的分组数,来自于分组卷积,当group数等于输入输出channel数时,表示一个输出channel仅和一个输入channel连接,即实现了逐层卷积。
def conv_dw(dim_in,dim_out,stride):
return nn.Sequential(
nn.Conv2d(dim_in,dim_in,3,stride,1,group=dim_in,bias=False),
nn.BatchNorm2d(dim_in),
nn.Relu(inplace=True),
nn.Conv2d(dim_in,dim_out,1,1,0,bias=False),
nn.BatchNom2d(dim_out),
nn.Relu(inplace=True))
4.2 网络结构及训练过程
MobileNet结构建立在如前一节所述的深度可分离的卷积上,除了第一层是完全卷积。通过以如此简单的术语定义网络,我们能够轻松探索网络拓扑以找到良好的网络。MobileNet架构如表1所示。
所有层后面都是一个batchnorm和ReLU非线性激活函数,除了最后的全连接层没有非线性,并输入softmax层进行分类。在第一个卷积层及深度可分卷积的第一层进行了stride大于1的下采样。最后的平均池化层将输出的空间分辨率减小为1。将逐层卷积和逐点卷积分别算作以层,MobeilNets一共有28层。
下图对比了具有batchnorm和ReLU非线性激活的普通卷积和具有batchnorm和ReLU非线性激活的深度可分卷积。
仅用少量的Mult-Adds来定义网络是不够的,确保这些操作可以高效地实现也很重要。例如,除非具有非常高的稀疏度,否则非结构化稀疏矩阵运算通常并不比密集矩阵运算快。我们的模型结构几乎将所有计算都放入密集的1×1卷积中,这可以通过高度优化的通用矩阵乘法(GEMM)函数来实现。通常,卷积由GEMM实现,但需要在内存中进行初始重新排序,称为im2col,以便将其映射到GEMM,这种方法用于Caffe中。1×1卷积不需要在内存中重新排序,可以直接用GEMM实现,GEMM是最高度优化的数值线性代数算法之一。如表2所示,MobileNet中1×1卷积包含了75%的参数,花费了95%的计算时间。剩下几乎所有的参数都包含在全连接层中。
MobileNet模型在TensorFlow中使用RMSprop进行训练,其异步梯度下降类似于Inception V3。然而,与训练大型模型相反,我们使用较少的正则化和数据增强技术,因为小型模型在过拟合方面的麻烦较少。在训练MobeilNets网络时,没有使用类似于GoogleNet的侧面输出或标签平滑技术,还通过限制小的裁剪图像块的数量减少了扭曲的图像的数量。因为在深度可分卷积中参数数量很少,因此不需要或者只需要很少的权重衰减(
l
2
l_2
l2正则化)。第四节所示的在ImageNet上的实验,所有的模型除了大小不同之外都使用了相同的训练参数。
4.3 宽度乘子:更瘦的网络
虽然基础MobileNet架构已经很小且延迟很低,但在特定用例或应用中,很多时候可能要求模型更小更快。为了构造这些更小且计算量更小的模型,我们引入了一个非常简单的参数 α \alpha α,称为宽度乘数。宽度乘数 α \alpha α的作用是在每层均匀地稀疏网络。对于某一层,应用宽度乘数 α \alpha α之后,输入通道数由M变为 α \alpha αM,输出通道数由N变为 α \alpha αN。
使用宽度乘数 α \alpha α时,深度可分卷积的计算量变为了 D K × D K × α M × D F × D F + α N × α M × D F × D F D_K \times D_K \times \alpha M \times D_F \times D_F + \alpha N \times \alpha M \times D_F \times D_F DK×DK×αM×DF×DF+αN×αM×DF×DF。 α ∈ ( 0 , 1 ] \alpha \in (0,1] α∈(0,1],常用取值是1,0.75,0.5,0.25。 α = 1 \alpha = 1 α=1是基础MobeilNets,当 α < 1 \alpha < 1 α<1时,表示对MobeilNets进行缩小。宽度乘数具有大概以 1 α 2 \frac{1}{\alpha^2} α21降低计算成本和参数数量的效果。宽度乘数可以应用于任何模型结构,以定义具有合理精度,延迟和大小权衡的新的较小模型。它用于定义需要从头开始训练的新的简化结构。
4.4 分辨率乘子:减小表示
第二个减少神经网络的计算成本的超参数是分辨率乘数 ρ \rho ρ,这个超参数可以应用于输入图像或者每一层的内部表示。在实验中作者只将分辨率乘子应用到了输入图像。 ρ ∈ ( 0 , 1 ] \rho \in (0,1] ρ∈(0,1],一般设置 ρ \rho ρ值以使得网络的输入大小为128,160,192,224。 ρ = 1 \rho = 1 ρ=1表示基础MobeilNets, ρ < 1 \rho < 1 ρ<1表示对MobeilNets减少计算量。实验分辨率乘子可以将计算量变为原来的 1 ρ 2 \frac{1}{\rho^2} ρ21。
当应用宽度乘子和分辨率乘子之后,深度可分卷积的总的计算量为: D K × D K × α M × ρ D F × ρ D F + α N × α M × ρ D F × ρ D F D_K \times D_K \times \alpha M \times \rho D_F \times \rho D_F + \alpha N \times \alpha M \times \rho D_F \times \rho D_F DK×DK×αM×ρDF×ρDF+αN×αM×ρDF×ρDF。
表3示出了逐个应用各参数收缩方法后单个卷积层的参数数量和计算量。
在嵌入式上部署的mobilenet模型,可以使用relu6代替relu。所谓的relu6就是relu的变体,设置正值部分的最大输出为6.这样做的好处是为了满足移动端部署的需求,因为移动端通常使用Float16或者Int8等较低精度的模型,如果不对激活函数的输出进行限制的话,激活值可能会存在溢出,造成精度损失。
5 实验
在本节中,我们首先通过减小网络宽度而不是层数来研究深度卷积的影响以及收缩的选择。然后,我们展示了基于两个超参数减少网络的权衡:宽度乘数和分辨率乘数,并将结果与许多流行模型进行比较。然后,我们展示了MobileNets在不同应用下的处理效果。
5.1 模型选择
首先,我们展示了具有深度可分离卷积的MobileNet与使用完全卷积构建的模型的对比。在表4中,我们看到使用深度可分离卷积与完全卷积相比在ImageNet上精度仅减少了1%,但却极大地减少了参数和运算。
接下来,我们展示了使用宽度乘数的更瘦模型与较浅模型进行比较的结果。较浅模型是将表1的MobeilNet中5个feature size为14 * 14 *512的层删除后的结果。表5展示了尽管两个网络具有相近的参数数量和计算量,但是thinner MobeilNet比浅层网络的准确率高3%。
5.2 模型压缩参数
表6给出了使用宽度乘子
α
\alpha
α对MobeilNet进行压缩时的准确率、计算量和参数数量的变化情况。可以看出逐步减小
α
\alpha
α值时准确率在慢慢减小,直到
α
\alpha
α减小到0.25时,准确率才有了较大幅度的下降。
表7给出了使用分辨率乘子
ρ
\rho
ρ对MobeilNet进行压缩时的准确率、计算量和参数数量的变化情况。可以看出逐步减小
ρ
\rho
ρ值时准确率在慢慢减小。
表4给出了在ImageNet数据集上16个模型的准确率和其计算量,这16个模型时由
α
∈
{
1
,
0.75
,
0.5
,
0.25
}
\alpha \in \{1,0.75,0.5,0.25\}
α∈{1,0.75,0.5,0.25}和输入图像分辨率为
{
224
,
192
,
160
,
128
}
\{224,192,160,128\}
{224,192,160,128}两两组合得到的。当
α
=
0.25
\alpha = 0.25
α=0.25时,准确率有一个较大幅度的下降。图像横轴为对数域。
图5展示了图4中16个对应模型的参数数量。
表8将完整MobeilNet和原始的GoogleNet和VGG16进行了对比。MobileNet几乎与VGG16一样准确,同时参数数量缩小了32倍,计算量降低了27倍。它比GoogleNet更精确,同时体积更小,计算量减少2.5倍以上。
图9对比了
α
=
0.5
\alpha = 0.5
α=0.5和输入图像尺寸为
160
×
160
160 \times 160
160×160的MobeilNet与AlexNet、ShuffleNet的对比结果。压缩的MobileNet比AlexNet好4%,同时比AlexNet小45倍,计算小9.4倍。它也比Squeezenet好4%,大小相同,计算量减少22倍。
5.3 细粒度分类
我们训练MobileNet在Stanford Dogs数据集上进行细粒度识别,我们扩展了The unreasonable effectiveness of noisy data for fine-grained recognition的方法,并从网上收集了更大但嘈杂的训练集。我们使用嘈杂的网络数据预先训练细粒度狗识别模型,然后在Stanford Dogs训练集上微调模型,结果如表10所示。MobileNet在大大减少计算和尺寸的情况下实现了state-of-art的结果。
5.3 大规模地图定位
PlaNet将地图图像拍摄地判别作为分类问题进行处理。该方法将地球划分为一个地理单元格网格,作为目标类别,并在数百万张带地理标记的照片中训练卷积神经网络。PlaNet已被证明可以成功地定位各种各样的照片,并且优于同类型网络Im2GPS。
我们使用MobileNet架构在相同数据上重新训练PlaNet。基于Inception V3架构的完整PlaNet模型拥有5200万个参数和57.4亿计算量。MobileNet模型只有1300万个参数,主体有300万个,最后一层有1000万个,58万计算量。最终结果如表11所示,尽管更紧凑,但与PlaNet相比,MobileNet版本的性能仅略有下降。而且,它仍然远远优于Im2GPS。
5.5 人脸属性
MobileNet的另一个应用是压缩具有未知或深奥训练过程的大型系统。在面部属性分类任务中,我们展示了MobileNet与蒸馏—深度网络的知识转移技术之间的协同关系。我们寻求减少一个具有7500万个参数和16亿次计算量的大型面部属性分类器。该分类器在类似于YFCC100M的多属性数据集上训练。
我们使用MobileNet架构训练面部属性分类器。蒸馏通过训练分类器来模拟较大模型的输出而不仅时使用ground-truth标签,从而实现大型(可能是无限的)未标记数据集的训练。结合蒸馏训练的可扩展性和MobileNet的简约参数化,终端系统不仅不需要正规化(例如,重量衰减和早期停止),而且还表现出增强的性能。从表12中可以看出,基于压缩的MobileNet的分类器具有良好的性能:它实现了与基准网络(平均AP)相似的平均精度,同时计算量仅为原来的1%。
5.6 目标检测
MobileNet还可以作为现代物体检测系统中的有效基础网络进行部署。我们根据最近赢得2016年COCO挑战的工作,报告了针对COCO数据进行物体检测训练的MobileNet的结果。如表13所示,在Faster-RCNN和SSD框架下,MobileNet与VGG和Inception V2 [13]进行了比较。
在我们的实验中,SSD使用300输入分辨率(SSD 300)进行评估,并将Faster-RCNN与300和600输入分辨率(FasterRCNN 300,Faster-RCNN 600)进行比较。Faster-RCNN模型评估每个图像的300个RPN提议框。模型在COCO train + val上训练,不包括8k的迷你图像。在迷你图像集上进行评估。对于这两个框架,MobileNet在只有一小部分计算复杂性和参数数量的情况下,实现了与其他网络相当的结果。
5.7 人脸描述
FaceNet模型是最先进的人脸识别模型,它基于三元组损失构建人脸描述特征。为了构建移动环境下使用的FaceNet模型,我们使用蒸馏来最小化在训练集上FaceNet模型和MobeilNet模型的输出的平方差进行训练。实验结果如表14所示。
6 结论
我们提出了一种基于深度可分离卷积的称为MobileNets的新模型架构。我们研究了一些导致高效模型的重要设计决策。然后,我们演示了如何使用宽度乘数和分辨率乘数构建更小,更快的MobileNets,通过折衷合理的精度来减小大小和延迟。然后,我们将不同的MobileNets与流行的型号进行了比较,展示了出众的尺寸,速度和准确性。最后,我们通过展示MobileNet在应用于各种任务时的有效性得出结论。作为帮助采用和探索MobileNets的下一步,我们计划在Tensor Flow中发布模型。