轻量级网络开山之作:MobileNet

目录

1 MobileNet v1

2 MobileNet V2

3 MobileNet v3


        前面我们谈到的卷积神经网络,内存需求大、运算量大,往往无法在移动设备以及嵌入式设备上运行(比如resnet-152有644m参数,基本不可能在移动设备上运行)

        而深度学习的初衷就是为了能将AI技术应用落地,因此轻量级网络应用而生。MobileNet网络是由google团队在2017提出的,专注于移动端或嵌入式设备中使用,是轻量级网络的开山之作。

1 MobileNet v1

        MobileNet v1相比传统卷积神经网络,在准确率小幅降低的前提下大大减少了模型参数与运算量。(相比VGG16准确率减少了0.9%,模型参数只有VGG的1/32)

        如果你已经了解过ResNeXt中的分组卷积,那么这里减少模型参数的方式理解起来就很简单:DW卷积(Depthwise Conv)+PW卷积(Pointwise Conv), 即所谓的深度可分离卷积(Depthwise Separable Conv)

        正如在上一篇ResNeXt笔记中所展示的,DW卷积(Depthwise Conv)就是分组卷积的特例——将每个输入通道都分为一个组,分组进行卷积。

 普通卷积

DW卷积

        如下图所示,深度可分离卷积即是先进行DW卷积,再进行PW卷积(使用1x1卷积进行通道融合)

        如下图所示,这样可以有效地降低卷积操作的计算量

        MobileNet V1的基本架构如上图所示,结构类似于VGG网络,即把卷积层串行堆叠起来即可,只是将普通卷积换成了DW卷积

        可以看到,其计算量(Mult-Adds)和参数量都远远低于GoogleNet和VGG-16

        最后,尽管基本的MobileNet V1架构已经很小,延迟也很低,但很多时候尽管基本的MobileNet架构已经很小,延迟也很低,但很多时候,特定的用例或应用程序可能需要更小更快的模型。

        将模型变得更小,最直接的方法无非两个,减少网络中的通道数,以及减少输入网络的图片大小。MobileNet可使用超参数width multiplier α来设置通道数与基本架构的比例和超参数resolution multiplier ρ来设置图片大小与基本架构的比例,此时卷积层的计算量计算公式如下图所示

        对于不同的α和ρ效果如上图所示,在使用中,可以根据实际的项目需求来选择不同的超参数设置。

2 MobileNet V2

        MobileNet V2网络由google团队在2018提出的,相比V1,计算速度更快、模型更小、准确率更高。

        v2版本的改进主要是优化MobileNet-v1中存在的一些问题

                1. MobileNet-v1结构类似于VGG的串联结构,ResNet已经证明了使用skip connect的有效性,考虑也在MobileNet中加入skip connect。

                2. 若对 ReLU 的激活范围不加限制,输出范围为 0 到正无穷,如果激活值非常大,分布在一个很大的范围内,那么低精度的float16/int8无法很好地精确描述如此大范围的数值,会带来精度损失。因此将Relu替换为Relu6(min(max(0,x),6)),提升在移动端数值低精度(float16/int8 )情况下的模型泛化性。

                3.深度可分离卷积(Depthwise Separable Conv)中存在的问题:DW卷积确实有效地降低了计算量,DW+PW的结构在性能上也能接近普通卷积。但在实际中发现DW部分的卷积核容易训废掉,其卷积核参数大部分为0,根据论文中的解释,这主要是因为Relu函数会让数据损失一些信息,作者做了下图的实验来说明。

        如图所示,作者将输入图片(input)乘以一个矩阵T映射到n维空间中,对整体使用relu函数,再将得到的结果乘以矩阵T的逆还原到二维空间,得到Output,从图片中可以看到,当dim=2,3,5时,损失的信息非常严重,当我们增加dim到15,30的时候,损失的信息就变少了。

        也就是说在低纬度做relu运算,会造成大量的信息损失,而在高纬度做Relu运算,信息损失就会减少,而dw卷积的kernel_dim相对于普通卷积要小得多(如64维的普通卷积有64x64个卷积核,而64维的dw卷积仅有64个卷积核),因此维度过低的dw卷积经过relu很容易造成信息损失,这就解释了为什么dw卷积的卷积核很多都是0。

        解决方法也很简单,维度低就升维,因此作者将resnet中的Residual block(先使用1x1卷积降维,经过3x3卷积再使用1x1卷积降维)

        改成了Inverted residuals block(先使用1x1卷积升维,经过深度可分离卷积后,再使用1x1卷积降维,同时降维后的卷积层不接relu),这样进入relu的全部是高维特征,自然减少了信息损失。(由于dw卷积计算量本身就比较低,增加一些维度并不会增强太多的计算量,并且升维以后更利于在推理时实现高效的计算)

        此外,作者仅在stride=1且输入通道和输出通道相同时使用skip connect,对于发生改变的地方不使用。

        MobileNetV2网络结构如上图所示

                其中 t 是扩展因子(升维倍数)

                        c 是输出特征矩阵深度channel

                        n 是bottleneck重复次数

                        s 是步距(针对第一层,其他为1)

Classification

  4d87acf6ff6a1dd3d3f173b2c0902db4.png 

Object Detection

        可以看到v2比v1提升相对较大(特别是在速度上),在CPU上也能以不太慢的速度运行。

3 MobileNet v3

        全面超越v2版本,目前在轻量级网络中仍有一席之地。

改进:

  1. 使用NAS搜索参数(Neural Architecture Search)

        简单来说就是利用机器学习技术去自动地搜索哪些网络结构比较好,而不是像GoogleNet那样人工去调参,目前这块还属于有钱人的游戏,我对这块不太了解,如果对搜索细节感兴趣,建议去看原论文。

      2. 重新设计耗时层结构

                a. 对搜索出来的结构的输出层部分进行优化,去掉那些不影响精度的层,并将最后一组用于升维的1x1卷积层移动到全局平均池化层之后,以缩小模型。

                b. 将第一个stage的卷积层从v2中的32减少到16

         3. 更新了Block(bneck)

                a. 增加了SE(Squeeze-and-Excite)模块(通道注意力)(来源于SENet(2017年ILSVRC冠军))

                计算示例如上图所示,简单来说就是通过添加两个全连接层插件,让模型可以通过自动学习对那些比较重要的通道施加更大的权重       

                b. 使用了新的激活函数h-swish(swish函数的近似)

 1b90bfea393519d230a79b1ad8035a7b.png

                c. 去掉了pw卷积后的激活函数

v3网络结构如下,有lager和small两个版本,适用于不同性能的移动设备。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值