论文地址:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
民间实现:caffe | Tensorflow
官方代码:tensorflow/models
前言
这篇论文是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 ,卷积核参数量表示为