论文地址:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
民间实现:caffe | Tensorflow
官方代码:tensorflow/models
有tensorflow的实现: https://github.com/tensorflow/models/blob/master/slim/nets/mobilenet_v1.md
caffe也有人实现: https://github.com/shicai/MobileNet-Caffe,
前言
这篇论文是Google针对手机等嵌入式设备提出的一种轻量级的深层神经网络,取名为MobileNets。个人感觉论文所做工作偏向于模型压缩方面,核心思想就是卷积核的巧妙分解,可以有效减少网络参数。可能由于刚发布,谷歌还没有放出官方代码(Tensorflow),谷歌官方已经开源了这部分代码(2017.6.15),具体参见文中地址。另外,在Github上搜索“MolileNets”,可发现一些个人实现的代码,部分会提供训练好的模型。博主跑过其中的caffe模型,发现inference速度并没有怎么提升,看网上讨论,应该是caffe框架的问题,要想大幅提升速度,应该只能依赖Tensorflow框架了。
摘要
我们提供一类称为MobileNets的高效模型,用于移动和嵌入式视觉应用。 MobileNets是基于一个流线型的架构,它使用深度可分离的卷积来构建轻量级的深层神经网络。我们引入两个简单的全局超参数,在延迟度和准确度之间有效地进行平衡。这两个超参数允许模型构建者根据问题的约束条件,为其应用选择合适大小的模型。我们进行了资源和精度权衡的广泛实验,与ImageNet分类上的其他流行的网络模型相比,MobileNets表现出很强的性能。最后,我们展示了MobileNets在广泛的应用场景中的有效性,包括物体检测,细粒度分类,人脸属性和大规模地理定位。
引言和背景介绍
这部分是说,随着深度学习的发展,卷积神经网络变得越来越普遍。当前发展的总体趋势是,通过更深和更复杂的网络来得到更高的精度,但是这种网络往往在模型大小和运行速度上没多大优势。一些嵌入式平台上的应用比如机器人和自动驾驶,它们的硬件资源有限,就十分需要一种轻量级、低延迟(同时精度尚可接受)的网络模型,这就是本文的主要工作。
在建立小型和有效的神经网络上,已经有了一些工作,比如SqueezeNet,Google Inception,Flattened network等等。大概分为压缩预训练模型和直接训练小型网络两种。MobileNets主要关注优化延迟,同时兼顾模型大小,不像有些模型虽然参数少,但是也慢的可以。
MobileNets模型结构
深度可分解卷积
MobileNets模型基于深度可分解的卷积,它可以将标准卷积分解成一个深度卷积和一个点卷积(1 × 1卷积核)。深度卷积将每个卷积核应用到每一个通道,而1 × 1卷积用来组合通道卷积的输出。后文证明,这种分解可以有效减少计算量,降低模型大小。图2说明了标准卷积是如何进行分解的。
直观上来看,这种分解在效果上确实是等价的。比如,把上图的代号化为实际的数字,输入图片维度是11 × 11 × 3,标准卷积为3 × 3 × 3 ×16(假设stride为2,padding为1),那么可以得到输出为6 × 6 × 16的输出结果。现在输入图片不变,先通过一个维度是3 × 3 × 1 × 3的深度卷积(输入是3通道,这里有3个卷积核,对应着进行计算,理解成for循环),得到6 × 6 × 3的中间输出,然后再通过一个维度是1 × 1 × 3 ×16的1 ×1卷积,同样得到输出为6 × 6 × 16。以上解析还可以借助一幅经典的GIF图来理解,先放这里了。
接下来作者计算了这种分解可以多大程度上减少参数量。这里首先指出论文中存在的一处笔误,下图标注部分写错了,正确应为 DG×DG×N 。
首先是标准卷积,假定输入F的维度是 DF×DF×M ,经过标准卷积核K得到输出G的维度 DG×DG×N ,卷积核参数量表示为 DK×DK×M×N 。如果计算代价也用数量表示,应该为 DK×DK×M×N×DF×DF 。
现在将卷积核进行分解,那么按照上述计算公式,可得深度卷积的计算代价为 DK×DK×M×DF×DF ,点卷积的计算代价为 M×N×DF×DF 。
将二者进行比较,可得:
MobileNets使用了大量的3 × 3的卷积核,极大地减少了计算量(1/8到1/9之间),同时准确率下降的很少,相比其他的方法确有优势。
模型结构和训练
MobileNets结构建立在上述深度可分解卷积中(只有第一层是标准卷积)。该网络允许我们探索网络拓扑,找到一个适合的良好网络。其具体架构在表1说明。除了最后的全连接层,所有层后面跟了batchnorm和ReLU,最终输入到softmax进行分类。图3对比了标准卷积和分解卷积的结构,二者都附带了BN和ReLU层。按照作者的计算方法,MobileNets总共28层(1 + 2 × 13 + 1 = 28)。
MobileNet将95%的计算时间用于有75%的参数的1×1卷积,作者采用tensorflow框架进行训练,因为过拟合不太容易,所以数据增强和规则化用的不多。
宽度乘数
这里介绍模型的第一个超参数,即宽度乘数 α 。为了构建更小和更少计算量的网络,作者引入了宽度乘数 α ,作用是改变输入输出通道数,减少特征图数量,让网络变瘦。在 α 参数作用下,MobileNets某一层的计算量为:
其中, α 取值是0~1,应用宽度乘数可以进一步减少计算量,大约有 α2 的优化空间。
分辨率乘数
第二个超参数是分辨率乘数 ρ ,分辨率乘数用来改变输入数据层的分辨率,同样也能减少参数。在 α 和 ρ 共同作用下,MobileNets某一层的计算量为:
其中, ρ 是隐式参数, ρ 如果为{1,6/7,5/7,4/7},则对应输入分辨率为{224,192,160,128}, ρ 参数的优化空间同样是 ρ2 左右。 表3可以看出两个超参数在减少网络参数的上的作用。
实验分析
模型选择
表4中,同样是MobileNets的架构,使用可分离卷积,精度值下降1%,而参数仅为1/7。
表5中,深且瘦的网络比浅且胖的网络准确率高3%。
模型收缩超参数
表6中, α 超参数减小的时候,模型准确率随着模型的变瘦而下降。
表7中, ρ 超参数减小的时候,模型准确率随着模型的分辨率下降而下降。
表8中,在ImageNet数据集上,将MobileNets和VGG与GoogleNet做了对比。
目标检测
这里的实验主要是将MobileNets作为目标检测网络Faster R-CNN和SSD的基底(base network),和其他模型在COCO数据集上进行了对比。(为什么不在VOC PASCAL上进行对比,应该更直观吧?也不给一个帧率,不知道速度怎么样)