https://arxiv.org/abs/1704.04861
设计一种深度模型加速的算法,可以在基本不影响准确率的前提下大大减少计算时间和参数数量。为移动和嵌入式视觉应用提出了一种有效的解决方案。
提出一种将标准卷积层拆分成两个卷积层(depthwise和pointwise)的MolileNet网络,描述了一个有效的网络架构和一组两个超参数,以便构建非常小的模型,可以轻松地匹配移动和嵌入式视觉应用的设计要求。
提高准确性的这些进步并不一定使网络在尺寸和速度方面更有效率。要在既不降准确率的同时减少参数量提高计算速度。
1.前期的基础:
压缩网络的方法:
1.由[26]中最初引入的深度可分离卷积,它是后面构建MobileNet的基础。它在诞生之后随即被用在了Inception模型上,在inception上它的主要作用是用来减少前几层的计算量。之后,Xception网络[3]演示了如何扩展深度可分离滤波器以执行Inception V3网络。
2.扁平化网络[16]利用完全因式分解的卷积构建了一个网络,并展示了极端因式分解网络的潜力。因式分解网络[34]引入了类似的分解卷积以及拓扑连接的使用。
3.使用瓶颈方法来设计一个非常小的网络——Squeezenet
4.缩小,分解或压缩预训练网络。
5.一种新兴的方法是低位网络。
2.深度可分离卷积:
MobileNet模型基于深度可分卷积,这是一种分解卷积的形式,它将标准卷积分解为深度卷积(depthwise convolution 宽度相当于是无穷的)和称为逐点卷积( pointwise convolution)的1*1卷积.对于MobileNets,深度卷积将单个滤波器应用于每个输入通道。逐点卷积然后应用1*1卷积来组合输出的深度卷积。标准卷积将过滤通道和组合通道、提取空间特征的作用组合在一起。深度可分离的卷积将其分成两层,一层用于过滤通道,另一层用于组合通道。这种因式分解具有大幅度减少计算和模型大小的效果。
如下图:
上图,标准卷积分解为了深度卷积和逐点卷积。(b)+(c)代替(a)。
过程解析:
假设有N个卷积核,每个卷积核维度是DK*DK*M,输入feature map的通道数是M,输出feature map为DF*DF*N。那么(b)表示用M个维度为DK*DK*1的卷积核去卷积对应输入的M个feature map,然后得到M个结果,而且这M个结果相互之间不累加(传统的卷积是用N个卷积核卷积输入的所有(也就是M个)feature map,然后累加这M个结果,最终得到N个累加后的结果),注意这里是用M个卷积核而不是N个卷积核,所以(b)中没有N,只有M。因此计算量是DF*DF*DK*DK*M。(b)生成的结果应该是DF*DF*M。(c)表示用N个维度为1*1*M的卷积核卷积(b)的结果,即输入是DF*DF*M,最终得到DF*DF*N的feature map。这个就可以当做是普通的一个卷积过程了,所以计算量是DF*DF*1*1*M*N(联系下前面讲的标准卷积是DF*DF*DK*DK*M*N,就可以看出这个(c)其实就是卷积核为1*1的标准卷积)。采用这种算法的计算量变成了DF*DF*DK*DK*M+DF*DF*M*N。相比原来的标准卷积,计算量变为原来的:(也就是说如果卷积核大小为3*3,那么差不多卷积操作的时间能降到原来的1/9左右!)
相关分析:
深度可分卷积由两层组成:深度卷积和逐点卷积。我们使用深度卷积为每个输入通道(输入深度)应用单个滤波器。然后使用简单的卷积的逐点卷积来创建深度层的输出的线性组合。MobileNets在每一层使用BN和ReLU两种非线性变换。与标准卷积相比,深度卷积非常有效。然而,它只会滤除输入通道,不会将它们组合起来以创建新功能。因此,需要通过1*1卷积来计算深度卷积输出的线性组合的附加层来生成这些新特征。
3.MobileNet架构的构建:
MobileNet结构是建立在上一节中提到的深度可分离的卷积上的,除了第一层是全卷积。通过以这种简单的术语定义网络,我们可以轻松探索网络拓扑以找到一个良好的网络。表1中定义了MobileNet架构。除最终的全连接层之外(没有非线性),所有层之后都是BN层[13]和ReLU非线性激活层,并馈入softmax层用于分类。
图3将具有常规卷积,BN层和ReLU非线性层与具有深度卷积的因式分解层,逐点卷积以及每个卷积层之后的BN和ReLU进行对比。向下采样在深度卷积和第一层中间通过大步卷积进行处理。在完全连接的层之前,最终的平均汇聚将空间分辨率降低到1。MobileNet拥有28层,将深度和逐点卷积统计为单独的层数。(这里dw就表示depthwise。)
MobileNet将其计算时间的95%花费在卷积中,其中还有75%的参数可以在表2中看到。几乎所有的附加参数都在完全连接的层中。(我们的模型结构将几乎所有的计算都放入了密集的1*1卷积中。这可以通过高度优化的通用矩阵乘法(GEMM)函数来实现。卷积通常由GEMM实现,但需要在内存中初始重新排序,称为im2col,以便将其映射到GEMM。例如,这种方法在流行的Caffe软件包[15]中使用。1*1卷积不需要在内存中重新排序,并且可以直接使用GEMM来实现,GEMM是最优化的数值线性代数算法之一)MobileNets总共28层(1 + 2 × 13 + 1 = 28)。
4.架构的完善(两个超参数的添加)
1.宽度乘数:
尽管基础MobileNet体系结构已经很小且延迟很低,但许多时候,特定用例或应用程序可能要求模型变得更小更快。为了构造这些更小,计算量更小的模型,我们引入了一个非常简单的参数α,称为宽度乘法器。宽度乘数α的作用是在每层均匀地减薄网络。对于给定的层和宽度乘数α,输入通道M的数量变为αM,输出通道数量N变为αN。
具有宽度乘法器α的深度可分离卷积的计算成本为:
α的典型设置为1,0.75,0.5和0.25。α=1是MobileNet的基线,α<1是缩小的MobileNets。宽度乘数具有通过大致减少α^2计算成本和二次参数数量的效果。宽度乘数可应用于任何模型结构,从而以合理的精度,时延和大小折衷定义新的较小模型。它被用来定义一个需要从头开始训练的新的简化结构。
2.分辨率乘数:
用于降低神经网络计算成本的第二个超参数是分辨率乘数ρ。我们可以将其应用于输入图像。在实践中,我们通过设置输入分辨率隐式设置ρ。
我们现在可以将网络核心层的计算成本表示为深度可分卷积,其中宽度乘法器α和分辨率乘法器ρ:
其中ρ通常隐式设置,以便网络的输入分辨率为224,192,160或128。ρ=1是MobileNet的基线,ρ<1是计算MobileNets的缩减。分辨率乘数具有降低ρ^2计算成本的效果。
1.使用tensorflow
2.与inception v3相似的异步梯度下降
3.使用较少的正则和数据增强,因为小模型过拟合的概率不大。
4.我们不使用侧头或标签平滑
5.限制在inception中的小尺寸剪裁的数量。
6.权重衰减(l2正则化)使用较少或没有使用,因为该模型参数本来就不多。
MobileNet的深度可分离卷积与使用完全卷积构建的模型相比的结果。我们接下来会展示使用较少层数将较薄型号与宽度乘数与较浅型号比较的结果。为了使MobileNet更浅,表1中特征尺寸为的5层可分离滤波器被删除。表5显示,在相似的计算和参数数量下,使得MobileNets更薄更好的3%比使它们更浅。
欢迎批评指正,讨论学习~
最近在github放了两份分类的代码,分别是用Tensorflow和Pytorch实现的,主要用于深度学习入门,学习Tensorflow和Pytorch搭建网络基本的操作。打算将各网络实现一下放入这两份代码中,有兴趣可以看一看,期待和大家一起维护更新。
代码地址:
Tensorflow实现分类网络
Pytorch实现分类网络