摘要 Abstract
我们提出了一种用于移动和嵌入式视觉应用的称为MobileNets的高效模型。MobileNets基于一种流水线型的架构,该架构使用深度可分离卷积来构建轻量级的深度神经网络。我们引入了两个简单的全局超参数,可以有效地在延迟和准确性之间进行权衡。这些超参数允许模型构建者根据问题的约束条件为其应用程序选择合适大小的模型。我们在资源和准确性的权衡上进行了大量的实验,并在ImageNet分类上显示了比其他流行模型更强的性能。然后,我们在广泛的应用程序和用例中展示了MobileNets的有效性,包括目标检测、细粒度分类、人脸属性和以图搜地(大规模地理定位)
介绍 Introduction
自从AlexNet赢得ImageNet挑战:ILSVRC 2012,使深度卷积神经网络普及以来,卷积神经网络已经在计算机视觉中无处不在。总的趋势是为了获得更高的精度而使网络变得更深、更复杂(比如VGG,GooLeNet,Inception,ResNet等)。然而,这些提高准确性的进步并不一定使网络在规模和速度方面更有效。在机器人、自动驾驶汽车和增强现实等许多现实世界应用中,识别任务需要在计算量有限的平台上及时执行。(也就是说这些需要高效计算的模型中,很难在一些移动端中,由于计算能力受限,很难部署在其中)
所以在MobileNet论文中,作者提出了一种高效的网络架构和一组两个超参数,以构建非常小的、低延迟的模型,可以很容易地匹配移动和嵌入式视觉应用的设计需求。
作者还提了一下接下来的架构
Section 2 回顾了构建小型模型的前期工作
Section 3 描述了MobileNet架构和两个超参数宽度超参数和分辨率超参数来定义更小和更有效的MobileNet
Section 4 描述了在ImageNet上的实验,以及各种不同的应用程序和用例
Section 5 总结和结论
过去研究 Prior Work
在最近(2017年)的研究中,人们对构建小型高效的神经网络越来越感兴趣。许多不同的方法可以分为压缩预处理网络和直接训练小网络两类。所以作者提出了一类网络架构,允许模型开发人员专门为其应用选择一个匹配资源限制(延迟、大小)的小型网络。MobileNets主要关注优化延迟,但也是一个小型网络,而许多关于小型网络的论文只关注规模而不考虑速度。
小网络MobileNet主要是由深度可分离卷积构建的,并且在X Inception中也显示了如何用这个depthwise seqarable convolutions深度可分离卷积。
还有一种得到小网络的方法就是收缩、分解和压缩预处理网络,压缩会基于产品量化(product quantization)、哈希表(hashing)、剪枝(pruning)、矢量量化(vector quantization)和霍夫曼编码(Huffman coding)一些已经被提出的方法。除此之外,还有各种分解来加速预处理网络的速度。另一种训练小网络的方法是知识蒸馏(类似一个老师去教一个学生),它使用一个更大的网络来教一个更小的网络。还有另一种新兴的方法是低比特网络,也就是因为我们可以用极小的比特来存储我们的权重值,因为有时候我们保存权重的时候,很多位数的权重有时候不是必要的,我们可以用有限的位数来存储我们的权重值Xnornet: Imagenet classification using binary convolutional neural networks就提出了用二元网络来保存我们的权重值。
我认为知识蒸馏是一个很重要的方法,我后续也会关注知识蒸馏,研读论文,是一个非常好的思想。
除此之外,加速网络的方法还可以利用im2col + GEMM库来加速,im2col是将图片转为矩阵,因为矩阵的计算在现在已经被研究的比较透彻了,所以可以极快地加速矩阵的运算,所以可以利用转为矩阵进行计算来得到更快的速度,GEMM是一个加速矩阵计算的库
MobileNet 架构 MobileNet Architecture
在本节中,我们首先描述MobileNet的核心层,这些核心层是可深度分离卷积。然后描述了MobileNet的网络结构,并描述了两种超参数宽度超参数和分辨率超参数得到的不同模型。
深度可分离卷积 Depthwise Separable Convolution
MobileNet模型是基于深度可分离卷积,这是一种分解卷积的形式,它将一个标准卷积分解为深度卷积和一个1x1卷积,称为pointwise convolution 逐点卷积。对于MobileNets,深度卷积depthwise convolution 是一个通道对应一个卷积核。然后用pointwise convolution点卷积 应用1x1卷积来合并深度卷积的输出。一个标准的卷积是在一个步骤中既滤波又将输入组合成一组新的输出。**深度可分离卷积将其分为两层,一层用于过滤,另一层用于组合。**这种分解方法具有大大减少计算量和模型尺寸的效果。
我们可以根据论文中的图比较深度可分离卷积核标准卷积的区别
我们可以从图中看到,标准卷积通过一步就可以得到结果,但是深度可分离卷积是有两块的,先depthwise,再pointwise进行卷积,两者构成深度可分离卷积。可能来说,论文中的图没有表现出很明显,因为分开来了,所以就重新找了一些资料来巩固深度可分离卷积与标准卷积的区别。
举个例子,如果是正常卷积
原始图像是二维的,大小是12x12。由于是RGB格式的,所以有三个通道,这相当于是一个3维的图片。其输入图片格式是:12x12x3。滤波器窗口大小是5x5x3。这样的话,得到的输出图像大小是8x8x1。
这就是普通卷积的工作原理。我喜欢把它想象成一个函数:12x12x3 —> (5x5x3x256) —>12x12x256(其中 5x5x3x256 代表内核的高度、宽度、输入通道数和输出通道数)。并不是说这不是矩阵乘法,我们不是将整个图像乘以内核,而是将内核移动到图像的每个部分并分别乘以它的小部分。
深度可分离卷积由两步组成:深度卷积和1x1卷积
首先,在输入层上应用深度卷积。如下图,使用3个卷积核分别对输入层的3个通道作卷积计算,再堆叠在一起。
再使用1x1的卷积(3个通道)进行计算,得到只有1个通道的结果
重复多次1x1的卷积操作(如下图为128次),则最后便会得到一个深度的卷积结果。
完整的过程如下:
看了这些图应该对深度可分离卷积有一个大概的认识,它极大的减少计算量和模型尺寸。我们可以用数学公式来得到我们的结果,如果我们的输入是D F × D F × M D_F 是特征图的大小shape,M MM是输入的通道数,类似的,N NN就是输出的通道数,在论文里,我们默认输出和输出的特征图都是相同的空间维度,并且两个特征映射都是正方形的。我们的模型收缩结果可以推广到具有任意大小和长宽比的特征图。
如果对于标准卷积K KK来说,我们很简单就知道,我们的卷积拥有D k × D k × M ×N个参数,并且对于我们的计算量来说,我们一次卷积要进行D k ⋅ D k ⋅ M乘法,然后这样的乘法一共要做,也就是我们输出的feature map的个数N ⋅ D F ⋅ D F ,所以总的来说,标准卷积的计算量为
所以我们可以看到,我们计算量是正比于我们
而对于MobileNet来说,他解耦了他们之间的关系,利用深度可分卷积来打破输出通道数量和内核大小之间的相互作用。
标准卷积运算是在卷积核的基础上对特征进行滤波,并结合特征生成新的表示。为了降低计算量,可以通过使用称为深度卷积的分解卷积,将其分为滤波和组合两个步骤。
深度可分离卷积由两层组成:深度卷积和点卷积。我们使用深度卷积为每个输入通道应用单个过滤器。点卷积使用一个简单的1x1卷积,然后用来创建一个线性组合的输出的深度层。MobileNets对这两个层都使用了Batch Normalization和ReLU非线性激活函数。
对于深度卷积,简单来说,就是对每一个通道利用单一的卷积,也就是一个卷积核对应一个通道,所以来说,这样的方法,还是对应前面的输入和输出,对于深度卷积来说,一次卷积需要D k ⋅ D k 次计算,然后会输出M ⋅ D F ⋅ D F 个特征图,所以深度卷积的计算量为
深度卷积相对于标准卷积来说是非常有效的。然而,它只过滤输入通道,而不合并它们来创建新特性。因此,为了生成这些新特性,需要一个额外的层,所以再加上点卷积,用一个1x1的卷积来线性组合。这两者合在一起,也就是深度可分离卷积 depthwise separable convolution 。
对于深度可分离卷积来说,我们可以得到它的计算量,它是深度卷积和点卷积之和:
我们通过将标准卷积的过滤和组合分开我们得到的计算量大大减小了
由于在MobileNet上使用的是3x3的卷积,N为输出通道数,也就是pointwise卷积核个数,所以深度可分离卷积使得计算量减小为原来1/8-1/9右,并且只在准确率上有一些细微的降低。
虽然论文中没给出参数之比,但是我们也给出来,因为发现结果也是与计算量之比一样的,由于深度可分离卷积的参数量为D k ⋅ D k ⋅ M + N ⋅ M,所以参数之比为