(一)MobileNet_v1----2017论文解读

MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

MobileNets:用于移动视觉应用的高效卷积神经网络

Abstract

我们为移动和嵌入式视觉应用提出了一种称为MobileNets的有效模型。MobileNets基于简化的架构,该架构使用深度可分离卷积来构建轻型深度神经网络。我们介绍了两个简单的全局超参数,它们可以有效地在延迟和准确性之间进行权衡。这些超参数允许模型构建者根据问题的约束条件为其应用选择合适大小的模型。我们对资源和精度进行了广泛的权衡取舍,与ImageNet分类中的其他流行模型相比,我们展示了强大的性能。然后,我们演示了MobileNets在各种应用程序和用例中的有效性,包括对象检测,细粒度分类,人脸属性和大规模地理定位。

1 Introduction

自从AlexNet [19]通过赢得ImageNet挑战:ILSVRC 2012 [24]来推广深度卷积神经网络以来,卷积神经网络就已经在计算机视觉中变得无处不在。总的趋势是建立更深,更复杂的网络以实现更高的准确性[27、31、29、8]。但是,这些提高准确性的进步并不一定会使网络在大小和速度方面更加高效。在许多现实世界的应用中,例如机器人技术,自动驾驶汽车和增强现实,识别任务需要在计算受限的平台上及时执行。

**本文描述了一种有效的网络体系结构和两个超参数集,以建立非常小的,低延迟的模型,这些模型可以轻松地满足移动和嵌入式视觉应用的设计要求。**第2节回顾了构建小型模型的先前工作。第3节介绍了MobileNet体系结构以及两个超参数宽度乘数和分辨率乘数,以定义更小,更高效的MobileNet。第4节介绍了ImageNet上的实验以及各种不同的应用程序和用例。第5节以总结和结论结束。

2 Prior Work

在最近的文献中,人们对建立小型高效的神经网络的兴趣日益浓厚 [16、34、12、36、22]。通常可以将许多不同的方法归类为压缩预训练网络或直接训练小型网络。本文提出了一类网络架构,允许模型开发人员专门为其应用选择与资源限制(延迟,大小)相匹配的小型网络。 MobileNets主要致力于优化延迟,但也可以产生小型网络。关于小型网络的许多论文只关注规模,而没有考虑速度。

MobileNets主要是从深度方向可分卷积中构建的,该方法最初在[26]中引入,随后在Inception模型[13]中使用,以减少前几层的计算量。扁平化网络[16]由完全分解的卷积构建网络,并显示了高度分解的网络的潜力。独立于本文之外,分解网络[34]引入了类似的分解卷积以及拓扑连接的使用。随后,Xception网络[3]演示了如何按比例扩展深度可分离的滤波器以执行Inception V3网络。另一个小型网络是Squeezenet [12],它使用瓶颈方法设计了一个非常小的网络。其他简化的计算网络包括结构化转换网络[28]
和油炸卷积网络[37]。
在这里插入图片描述
获得小型网络的另一种方法是收缩,分解或压缩预训练网络。文献中已经提出了基于乘积量化[36],散列[2]以及修剪,矢量量化和霍夫曼编码[5]的压缩。 另外,已经提出了各种因式分解来加速预训练的网络[14、20]。 训练小型网络的另一种方法是蒸馏[9],它使用较大的网络来教授较小的网络。 它是我们方法的补充,在第4节的一些用例中进行了介绍。另一种新兴方法是低位网络[4、22、11]。

3 MobileNet Architecture

在本节中,我们首先描述构建MobileNet的核心层,这些层是深度可分离的过滤器。然后,我们描述MobileNet网络结构,并以两个模型缩减超参数宽度乘数和分辨率乘数的描述作为结束。

3.1. Depthwise Separable Convolution

MobileNet模型基于深度可分离卷积,它是分解卷积的一种形式,可将标准卷积分解为深度卷积和称为点向卷积的1×1卷积。对于MobileNet,深度卷积将单个滤波器应用于每个输入通道。然后逐点卷积应用1×1卷积以将输出与深度卷积合并。一个标准的卷积既可以过滤又可以将输入合并为一组新的输出。深度可分离卷积将其分为两层,一个用于过滤的单独层和一个用于合并的单独层。这种分解具有显着减少计算和模型大小的效果。图2显示了如何将标准卷积2(a)分解为深度卷积2(b)和1×1点向卷积2(c)。

标准卷积层将DF×DF×M特征图F作为输入,并生成DF×DF×N特征图G,其中DFis平方输入特征图1的空间宽度和高度,M是输入通道数(输入深度),DG是正方形输出特征图的空间宽度和高度,N是输出通道的数量(输出深度)。

标准卷积层由大小为DK×DK×M×N的卷积核K进行参数化,其中DK是假定为正方形的核的空间尺寸,M是输入通道数,N是输出通道数,如先前定义。

假设跨度为1和填充为标准卷积的输出特征图,计算公式为:
G k , l , n = i , j , m K i , j , m , n F k + i 1 , l + j 1 , m 1 \mathbf{G}_{k, l, n}=\sum_{i, j, m} \mathbf{K}_{i, j, m, n} \cdot \mathbf{F}_{k+i-1, l+j-1, m} (1)
标准卷积的计算成本为:
D K D K M N D F D F 2 D_{K} \cdot D_{K} \cdot M \cdot N \cdot D_{F} \cdot D_{F} (2)
其中计算成本乘以输入通道数M,输出通道数N,内核大小Dk×Dk和特征图大小DF×DF。 MobileNet模型解决了这些术语及其相互作用。首先,它使用深度可分离卷积来打破输出通道数与内核大小之间的相互作用。

标准卷积运算具有基于卷积核对特征进行过滤并组合特征以产生新表示的作用。可通过使用因数分解卷积(称为深度可分离卷积)来将过滤和组合步骤分为两步,以进行实质性还原 在计算成本上。

深度可分离卷积由两层组成:深度卷积和点卷积。我们使用深度卷积在每个输入通道(输入深度)上应用单个滤波器。然后,使用逐点卷积(简单的1×1卷积)来创建深度层输出的线性组合。 MobileNets对这两个层都使用了batchnorm和ReLU非线性。

每个输入通道(输入深度)带有一个滤波器的深度卷积可以写成:
G ^ k , l , m = i , j K ^ i , j , m F k + i 1 , l + j 1 , m 3 \hat{\mathbf{G}}_{k, l, m}=\sum_{i, j} \hat{\mathbf{K}}_{i, j, m} \cdot \mathbf{F}_{k+i-1, l+j-1, m} (3)
其中ˆK是大小为DK×DK×M的深度卷积核,其中将第m个滤波器inˆK应用于F中的第m个通道,以生成滤波后的输出特征图ˆG的第m个通道。

深度卷积的计算成本为:
D K D K M D F D F 4 D_{K} \cdot D_{K} \cdot M \cdot D_{F} \cdot D_{F} (4)
相对于标准卷积,深度卷积非常有效。但是,它仅过滤输入通道,不会将它们组合以创建新功能。因此,需要额外的一层来计算通过1×1卷积的深度卷积输出的线性组合,以便生成这些新特征。

深度卷积和1×1(点向)卷积的组合称为深度可分离卷积,最初是在[26]中引入的。

深度可分离卷积代价:
D K D K M D F D F + M N D F D F 5 D_{K} \cdot D_{K} \cdot M \cdot D_{F} \cdot D_{F}+M \cdot N \cdot D_{F} \cdot D_{F} (5)
这是深度卷积和1×1点卷积的总和。

通过将卷积表示为过滤和组合的两步过程,我们可以减少以下计算:
D K D K M D F D F + M N D F D F D K D K M N D F D F = 1 N + 1 D K 2 \begin{aligned} & \frac{D_{K} \cdot D_{K} \cdot M \cdot D_{F} \cdot D_{F}+M \cdot N \cdot D_{F} \cdot D_{F}}{D_{K} \cdot D_{K} \cdot M \cdot N \cdot D_{F} \cdot D_{F}} \\ =& \frac{1}{N}+\frac{1}{D_{K}^{2}} \end{aligned}
MobileNet使用3×3深度可分离卷积,使用的计算量比标准卷积少8到9倍,而准确性仅略有降低,如第4节所示。

像[16,31]中那样在空间维度上进行额外的因式分解不会节省太多额外的计算,因为在深度卷积中只花费了很少的计算。
在这里插入图片描述

3.2. Network Structure and Training

在这里插入图片描述
如前一节所述,MobileNet结构基于深度可分离卷积,但第一层是完整卷积。通过以如此简单的术语定义网络,我们能够轻松地探索网络拓扑以找到一个好的网络。表1定义了MobileNet体系结构。所有层后面都带有一个batchnorm [13]和ReLU非线性,最后一个完全连接的层除外,该层没有非线性,并馈入softmax层进行分类。图3将具有常规卷积,batchnorm和ReLU非线性的层与具有深度卷积,1×1点向卷积以及每个卷积层之后的batchnorm和ReLU的分解层进行了对比。下采样是在深度卷积以及第一层中通过跨步卷积处理的。最终平均池在完全连接的层之前将空间分辨率降低为1。将深度和点积卷积计为单独的层,MobileNet有28层。

仅用少量的Mult-Adds定义网络是不够的。 确保这些操作可以有效实施也很重要。 例如,直到非常高的稀疏度,非结构化稀疏矩阵运算通常不比密集矩阵运算快。我们的模型结构将几乎所有计算都放入了密集的1×1卷积中。这可以通过高度优化的通用矩阵乘法(GEMM)函数来实现。卷积通常由GEMM实现,但需要在内存中进行名为im2col的初始重新排序,才能将其映射到GEMM。例如,这种方法在流行的Caffe软件包中使用[15]。 1×1卷积不需要在内存中进行重新排序,可以直接使用GEMM(这是最优化的数值线性代数算法之一)来实现。如表2所示,MobileNet将其95%的计算时间花费在1×1卷积中,其中也包含75%的参数。几乎所有其他参数都位于完全连接的层中。

使用RMSprop [33]在TensorFlow [1]中使用与Inception V3 [31]类似的异步梯度下降训练了MobileNet模型。但是,与训练大型模型相反,我们使用较少的正则化和数据增强技术,因为小型模型的过拟合麻烦较小。在训练MobileNets时,我们不使用侧边或标签平滑,并且通过限制在大型Inception训练中使用的小作物的大小来减少失真的图像数量[31]。此外,我们发现,对深度过滤器设置很少或很少的权重衰减(l 2正则化)非常重要,因为它们中的参数太少了。对于下一部分中的ImageNet基准测试,所有模型均使用相同的训练参数进行训练,无论模型的大小如何。

3.3. Width Multiplier: Thinner Models

在这里插入图片描述
尽管基本的MobileNet体系结构已经很小并且延迟很短,但是很多情况下,特定的用例或应用程序可能要求模型更小,更快。为了构造这些较小且计算量较小的模型,我们引入了一个非常简单的参数α,称为宽度乘数。宽度乘数α的作用是使每一层的网络均匀变薄。

对于给定的层和宽度乘数α,输入通道的数量变为αM,而输出通道的数量N变为αN。

具有宽度乘数α的深度可分离卷积的计算成本为:
D K D K α M D F D F + α M α N D F D F 6 D_{K} \cdot D_{K} \cdot \alpha M \cdot D_{F} \cdot D_{F}+\alpha M \cdot \alpha N \cdot D_{F} \cdot D_{F} (6)
其中,α∈(0,1]的典型设置为1、0.75、0.5和0.25。α= 1是基准MobileNet,α<1是简化的MobileNets。宽度乘数具有降低计算成本和二次方参数数量的作用宽度乘数可以应用于任何模型结构,以合理的精度,等待时间和大小折衷定义一个新的较小模型,用于定义一个新的简化结构,需要从头开始进行训练。

3.4. Resolution Multiplier: Reduced Representation

在这里插入图片描述
减少神经网络计算成本的第二个超参数是分辨率乘数ρ。

我们将其应用于输入图像,然后通过相同的乘数来减少每一层的内部表示。实际上,我们通过设置输入分辨率来隐式设置ρ。

现在,我们可以将网络核心层的计算成本表示为具有宽度乘数α和分辨率乘数ρ的深度可分离卷积:
D K D K α M ρ D F ρ D F + α M α N ρ D F ρ D F 7 D_{K} \cdot D_{K} \cdot \alpha M \cdot \rho D_{F} \cdot \rho D_{F}+\alpha M \cdot \alpha N \cdot \rho D_{F} \cdot \rho D_{F} (7)
其中ρ∈(0,1]通常是隐式设置的,因此网络的输入分辨率为224、192、160或128。ρ= 1是基准MobileNet,而ρ<1是简化的计算MobileNets。将计算成本降低ρ2的效果。

作为示例,我们可以查看MobileNet中的典型层,并了解深度可分离卷积,宽度乘数和分辨率乘数如何减少成本和参数。表3显示了将体系结构收缩方法依次应用于该层时该层的参数计算和数量。第一行显示了完整卷积层的Mult-Adds和参数,输入特征图的大小为14×14×512,内核K的大小为3×3×512×512。我们将在下一部分中详细介绍在资源和准确性之间进行权衡。

4 Experiments

在本节中,我们首先研究深度卷积的影响以及通过减小网络的宽度而不是层数来选择收缩的方法。然后,我们基于两个超参数(宽度乘数和分辨率乘数)显示减少网络的权衡,并将结果与许多流行的模型进行比较。然后,我们研究MobileNets应用于许多不同的应用程序。

4.1. Model Choices

在这里插入图片描述
首先,我们展示了与具有完全卷积构建的模型相比,具有深度可分离卷积的MobileNet的结果。 在表4中,我们看到,与完全卷积相比,使用深度可分离卷积仅将ImageNet的精度降低了1%,从而大大节省了多添加项和参数。

接下来,我们将比较使用宽度乘数的较薄模型与使用较少图层的较浅模型的结果。为了使MobileNet更浅,表1中删除了5层功能尺寸为14×14×512的可分离滤波器。表5显示,在类似的计算和参数数量下,使MobileNets变薄比使它们变浅好3%。

4.2. Model Shrinking Hyperparameters

表6显示了使用宽度乘数α缩小MobileNet体系结构的精度,计算和尺寸折衷。精度会平稳下降,直到在α= 0.25时架构变得太小为止。

表7显示了通过训练具有降低的输入分辨率的MobileNet来获得不同分辨率乘数的精度,计算和尺寸的折衷。精度在整个分辨率上都会下降。

图4显示了用宽度乘数α∈{1,0.75,0.5,0.25}和分辨率{224,192,160,128}的叉积得出的16种模型在ImageNet精度和计算之间的权衡。当模型在α= 0.25时变得很小时,结果呈对数线性增长。
在这里插入图片描述
图5显示了使用宽度乘数α∈{1,0.75,0.5,0.25}和分辨率{224,192,160,128}的叉积制成的16个模型的ImageNet精度和参数数量之间的权衡。

表8将完整的MobileNet与原始的GoogleNet [30]和VGG16 [27]进行了比较。 MobileNet的准确度几乎与VGG16一样,但要小32倍,而计算强度却要低27倍。它比GoogleNet更准确,但体积更小,计算量减少了2.5倍以上。

表9比较了减少的MobileNet的宽度乘数α= 0.5和降低的分辨率160×160。降低的MobileNet比AlexNet [19]好4%,而与AlexNet相比,缩小了45倍,而计算量却减少了9.4倍。在大约相同的大小和少22倍的计算量下,它也比Squeezenet [12]好4%。
在这里插入图片描述

4.3. Fine Grained Recognition

我们在斯坦福狗数据集上训练MobileNet进行细粒度识别[17]。我们扩展了[18]的方法,并从网上收集了比[18]更大甚至更嘈杂的训练集。我们使用嘈杂的网络数据来预训练细粒度的狗识别模型,然后在斯坦福狗训练集中对模型进行微调。 Stanford Dogs测试仪的结果在表10中。MobileNet可以大大减少[18]的计算量和尺寸,从而几乎达到[18]的最新结果。

4.4. Large Scale Geolocalizaton

PlaNet [35]的任务是确定在哪里拍摄照片作为分类问题。该方法将地球划分为用作目标类别的地理单元网格,并在数百万张带有地理标签的照片上训练卷积神经网络。 PlaNet已被证明可以成功地定位各种照片,并且胜过了解决同一任务的Im2GPS [6,7]。

我们使用MobileNet架构对同一数据重新训练PlaNet。基于Inception V3体系结构的完整PlaNet模型[31]具有5200万个参数和57.4亿个多添加项。 MobileNet模型只有1300万个参数,通常是300万个主体,1000万个最后一层,还有58万个附加项。如标签所示。如图11所示,尽管MobileNet版本更加紧凑,但与PlaNet相比仅提供了稍微降低的性能。而且,它仍然大大优于Im2GPS。

4.5. Face Attributes

MobileNet的另一个用例是使用未知或深奥的培训程序压缩大型系统。在人脸属性分类任务中,我们演示了MobileNet与蒸馏[9](一种用于深度网络的知识转移技术)之间的协同关系。我们力求减少具有7500万个参数和16亿个Mult-Adds的大型面部属性分类器。分类器在类似于YFCC100M [32]的多属性数据集上训练。

我们使用MobileNet架构提取人脸属性分类器。蒸馏[9]的工作原理是训练分类器,以模拟更大模型的输出,而不是真实标签,因此可以从大型(可能无限)的未标记数据集中进行训练。终端系统结合了蒸馏训练的可扩展性和MobileNet的简化参数设置,不仅不需要规范化(例如重量衰减和提前停止),而且还展示了增强的性能。从Tab可以明显看出。 12基于MobileNet的分类器可以抵御激进的模型收缩:它在属性(平均AP)上实现了与内部相似的平均平均精度,而仅消耗了1%的Multi-Adds。

4.6. Object Detection

MobileNet也可以部署为现代对象检测系统中的有效基础网络。 我们根据赢得2016年COCO挑战[10]的最新工作,报告经过训练可对COCO数据进行对象检测的MobileNet的结果。 在表13中,在Faster-RCNN [23]和SSD [21]框架下,将MobileNet与VGG和Inception V2 [13]进行了比较。 在我们的实验中,使用300输入分辨率(SSD 300)对SSD进行了评估,并将Faster-RCNN与300和600输入分辨率(Faster-RCNN 300,Faster-RCNN 600)进行了比较。 Faster-RCNN模型每个图像评估300个RPN建议框。 在不包括8k最小图像的COCO线性训练+ val上训练模型,并在最小上进行评估。 对于这两种框架,MobileNet都可以在计算复杂度和模型大小上实现一小部分的结果,与其他网络相比。

在这里插入图片描述
在这里插入图片描述

4.7. Face Embeddings

在这里插入图片描述
FaceNet模型是最先进的人脸识别模型[25]。 它基于三重态损失构建面部嵌入。 为了建立移动FaceNet模型,我们使用蒸馏来通过最小化FaceNet和MobileNet输出在训练数据上的平方差来进行训练。 表14中列出了非常小的MobileNet模型的结果。

5 Conclusion

我们基于深度可分离卷积提出了一种称为MobileNets的新模型体系结构。我们调查了一些导致有效模型的重要设计决策。然后,我们演示了如何通过权衡合理的精度以减少大小和延迟来使用宽度乘数和分辨率乘数来构建更小,更快的MobileNet。然后,我们将不同的MobileNets与流行的模型进行了比较,这些模型展示了出色的尺寸,速度和准确性特征。最后,我们演示了MobileNet在应用于各种任务时的有效性。为了帮助采用和探索MobileNets的下一步,我们计划在Tensor Flow中发布模型。

pytorch程序:

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
 
        def conv_bn(inp, oup, stride):
            return nn.Sequential(
                nn.Conv2d(inp, oup, 3, stride, 1, bias=False),
                nn.BatchNorm2d(oup),
                nn.ReLU(inplace=True)
            )
 
        def conv_dw(inp, oup, stride):
            return nn.Sequential(
                nn.Conv2d(inp, inp, 3, stride, 1, groups=inp, bias=False),
                nn.BatchNorm2d(inp),
                nn.ReLU(inplace=True),
    
                nn.Conv2d(inp, oup, 1, 1, 0, bias=False),
                nn.BatchNorm2d(oup),
                nn.ReLU(inplace=True),
            )
 
        self.model = nn.Sequential(
            conv_bn(  3,  32, 2), 
            conv_dw( 32,  64, 1),
            conv_dw( 64, 128, 2),
            conv_dw(128, 128, 1),
            conv_dw(128, 256, 2),
            conv_dw(256, 256, 1),
            conv_dw(256, 512, 2),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 1024, 2),
            conv_dw(1024, 1024, 1),
            nn.AvgPool2d(7),
        )
        self.fc = nn.Linear(1024, 1000)
 
    def forward(self, x):
        x = self.model(x)
        x = x.view(-1, 1024)
        x = self.fc(x)
        return x

程序部分转自:https://blog.csdn.net/qq_21997625/article/details/89513025

发布了66 篇原创文章 · 获赞 23 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_18315295/article/details/104214403