​​​​​​​#轻量级网络 MobileNetV1+V2+V3(原理+结构详解+代码)

目录

MobileNetV1

Depthwise separable convolution:深度可分离卷积

原理介绍:

深度可分离网络结构:

MobileNet网络结构:

 控制模型大小:

MobileNetV2:

原理介绍:

Linear Bottleneck:

Inverted residuals:(倒残差)

网络架构:

MoileNetV3:

网络结构改进:

头部结构改进:

尾部结构改进:

Relu6的激活层替换为h-swish:

Squeeze-and-excitation模块:

互补搜索结构:

资源受限的NAS(platform-aware NAS):

NetAdapt:

代码:


MobileNetV1

        MobileNet的核心思想就是卷积核的巧妙分解,能够有效减小网络参数。

Depthwise separable convolution:深度可分离卷积

原理介绍:

        MobileNet的基本单元是深度级可分离卷积(depthwise separable convolution),深度级可分离卷积其实是一种可分解卷积操作,其可以分解depthwise convolution和pointwise convolution,如图1所示。

图1:深度可分离卷积

(D_{k}表示的是卷积核 ,M表示的是通道数 ,N表示的是卷积核的个数) 

(a)标准卷积:卷积核是用在所有的输入通道上。

(b)Depthwise convolution:针对每个输入通道采用不同的卷积核,就是说一个卷积核对应一个输入通道,所以说depthwise convolution是深度级别的操作。

(c) Pointwise convolution:普通的1*1的卷积核。

图2中更清晰地展示了两种操作。

图2  depthwise convolution和pointwise convolution

        对于depthwise separable convolution,其首先是采用depthwise convolution对不同输入通道分别进行卷积,然后采用pointwise convolution将上面的输出再进行结合,这样其实整体效果和一个标准卷积是差不多的,但是会大大减少计算量和模型参数量。

参数量减少原因分析:

假定输入特征图大小是 D_{F} \times D_{F} \times M ,而输出特征图大小是 D_{K} \times D_{K} \times M \times D_{F} \times D_{F},其中  是特征图的宽和高,这是假定两者是相同的,而M和N指的是通道数。对于标准的卷积 D_{K} \times D_{K} ,其计算量将是:D_{K} \times D_{K} \times M \times N \times D_{F} \times D_{F},而对于depthwise convolution其计算量为:D_{K} \times D_{K} \times M \times D_{F} \times D_{F},pointwise convolution计算量是:M \times N \times D_{F} \times D_{F}  ,所以depthwise separable convolution总计算量是:D_{K} \times D_{K} \times M \times D_{F} \times D_{F} + M \times N \times D_{F} \times D_{F}

可以比较depthwise separable convolution和标准卷积如下:\frac{D_{K} \times D_{K} \times M \times D_{F} \times D_{F} + M \times N \times D_{F} \times D_{F}}{D_{K} \times D_{K} \times M \times N \times D_{F} \times D_{F}} = \frac{1}{N} + \frac{1}{D^{2}_{K}}

一般情况下N比较大,那么如果采用3x3卷积核的话,depthwise separable convolution相较标准卷积可以降低大约9倍的计算量。

深度可分离网络结构:

        depthwise separable convolution的基本结构如图3所示。

 图3 加入BN和ReLU的depthwise separable convolution

MobileNet网络结构:

 控制模型大小:

        为了构建更小,更少计算量的网络做者引入了宽度乘数分辨率乘数

宽度乘数:改变输入和输出的通道数减小特征图的数量来减小计算。(\alpha

参数记为 \alpha,其取值范围为(0,1],那么输入与输出通道数将变成\alpha M\alpha N,对于depthwise separable convolution,其计算量变为:D_{K} \times D_{K} \times \alpha M \times D_{F} \times D_{F} + \alpha M \times \alpha N \times D_{F} \times D_{F}可以比较depthwise separable convolution和标准卷积如下:

\frac{D_{K} \times D_{K} \times \alpha M \times D_{F} \times D_{F} + \alpha M \times \alpha N \times D_{F} \times D_{F}}{D_{K} \times D_{K} \times \alpha M \times \alpha N \times D_{F} \times D_{F}} = \frac{\alpha}{N} + \frac{\alpha ^{2}}{D^{2}_{K}}

宽度因子将计算量和参数降低了约\alpha^2倍,可很方便的控制模型大小。

分辨率乘数:经过减少输入图片的大小来起到减小计算。(\rho

depthwise separable convolution,其计算量变为:D_{K} \times D_{K} \times \alpha M \times \rho D_{F} \times \rho D_{F} + \alpha M \times \alpha N \times \rho D_{F} \times \rho D_{F}可以比较depthwise separable convolution和标准卷积如下:\frac{D_{K} \times D_{K} \times \alpha M \times \rho D_{F} \times \rho D_{F} + \alpha M \times \alpha N \times \rho D_{F} \times \rho D_{F}}{D_{K} \times D_{K} \times \alpha M \times \alpha N \times \rho D_{F} \times \rho D_{F}} = \frac{\alpha}{N} + \frac{\alpha ^{2} \rho ^{2}}{D^{2}_{K}}

分辨率因子将计算量和参数降低了约\rho^2倍,可很方便的控制模型大小。

MobileNetV2:

原理介绍:

Linear Bottleneck:

        论文中把网络层中的激活特征称为兴趣流形(mainfold of interest),代表网络层中的卷积和激活会形成我们感兴趣的内容。

        在神经网络中,兴趣流形可以嵌入到低维空间,并通过变换嵌入到下一个低维空间中(例如用1*1的卷积变换维数,转换兴趣流形所在空间维度)。MobileNetV1通过宽度因子在计算量和精度之间取折中,用宽度因子控制激活空间的维度,直到兴趣流形横跨整个空间。但是,深度卷积神经网络的层具有非线性激活函数的。因此会产生以下问题:

  • 激活空间兴趣流形完整度较高,通过非线性激活使得激活空间坍塌,存在丢失信息的情况。
  • 如果输入对应的输出是非零的,那么输入和输出之间是一个线性映射关系。(考虑减少运算量的目的,就需要尽可能的将网络维度降低,通过激活函数Relu会过滤很多有用信息,可以只用线性分类器。)

        Linear Bottleneck:用线性变换代替非线性激活

        架构思路:通过在卷积模块中后插入linear bottleneck来捕获兴趣流形。

Inverted residuals:(倒残差)

        MobileNetV1网络主要思路就是深度可分离卷积的堆叠。在V2的网络设计中,我们除了继续使用深度可分离(上一节介绍)结构之外,还使用了Expansion layer和 Projection layer。        

        Projection layer也是使用 1*1的网络结构,他的目的是希望把高维特征映射到低维空间去。另外说一句,使用1*1的网络结构将高维空间映射到低纬空间的设计,我们也称之为Bottleneck layer

        Expansion layer的功能正相反,使用1*1的网络结构,目的是将低维空间映射到高维空间。这里Expansion有一个超参数是维度扩展几倍。可以根据实际情况来做调整的,默认值是6,也就是扩展6倍。

        模块结构如图4所示,输入是24维输出也是24维,但在过程中扩展了6倍,模型是中间宽两头窄,与 residual block模型中间窄两头宽的形状想法,所以称为Inverted residuals。

 图4 Bottleneck layer模块结构

网络架构:

        架构图分析:如果tensor维度越低,卷积层的乘法计算量就越小。那么如果整个网络都是低维的tensor,那么整体计算速度就会很快。然而,如果只是使用低维的tensor效果并不会好。如果卷积层的过滤器都是使用低维的tensor来提取特征的话,那么就没有办法提取到整体的足够多的信息。所以,如果提取特征数据的话,我们可能更希望有高维的tensor来做这个事情。MobileNetV2就设计这样一个结构来达到平衡。

 图5 MobileNet网络架构图

MoileNetV3:

网络结构改进:

头部结构改进:

V1、V2都是从32个滤波器的常规3*3卷积层开始,但是只要16个滤波器就可以完成224*224特征图的滤波。

尾部结构改进:

在Mobilenetv2中,在Avg Pooling之前,存在一个1x1的卷积层,目的是提高特征图的维度,更有利于结构的预测,但是这其实带来了一定的计算量了,所以这里作者修改了,将其放在avg pooling的后面,首先利用Avg Pooling将特征图大小由7x7降到了1x1,降到1x1后,然后再利用1x1提高维度,这样就减少了7x7=49倍的计算量。结构改进如图6所示。

 图6 尾部模型修改

        为了进一步的降低计算量,作者直接去掉了前面纺锤型卷积的3x3以及1x1卷积,进一步减少了计算量,就变成了如下图第二行所示的结构,作者将其中的3x3以及1x1去掉后,精度并没有得到损失。这里降低了大约15ms的速度。

Relu6的激活层替换为h-swish:

h-swish= x\times ReLU6(x+3)/6                                               

        常规的swish使用的是x\times sigmoid(x),他可以显著提高神经网络的精度,但是sigmoid的计算太耗时,所以使用ReLU6代替。ReLU6能在特定模式下消除了由于近似sigmoid的不同实现而带来的潜在数值精度损失。并非所有网络的激活都是h-swish,前半部分还是使用常规Relu。因为h-swish仅在更深层次上有用。 此外,考虑到特征图在较浅的层中往往更大,因此计算其激活成本更高,所以作者选择在这些层上简单地使用ReLU(而非ReLU6),因为它比h-swish省时。

Squeeze-and-excitation模块:

        MobileNetV3 在核心架构中加入一种名为「Squeeze-and-Excitation」的神经网络(简称 SE-Net,也是 ImageNet 2017 图像分类冠军)。该神经网络的核心思想是通过显式地建模网络卷积特征通道之间的相互依赖关系,来提高网络所产生表示的质量。具体而言,就是通过学习来自动获取到每个特征通道的重要程度,然后依照这一结果去提升有用的特征并抑制对当前任务用处不大的特征。因为SE结构会消耗一定的时间,所以作者在含有SE的结构中,将expansion layer的channel变为原来的1/4,这样作者发现,即提高了精度,同时还没有增加时间消耗。模块如图7所示。

在这里插入图片描述

 图7 SE模块

互补搜索结构:

资源受限的NAS(platform-aware NAS):

计算和参数量受限的前提下搜索网络的各个模块,所以称之为模块级的搜索(Block-wise Search)。(整体搜索Large,如图8所示)

 图8 MoileNetV3-Large

NetAdapt:

用于对各个模块确定之后网络层的微调。
对于模型结构的探索和优化来说,网络搜索是强大的工具。研究人员首先使用了神经网络搜索功能来构建全局的网络结构,随后利用了NetAdapt算法来对每层的核数量进行优化。对于全局的网络结构搜索,研究人员使用了与Mnasnet中相同的,基于RNN的控制器和分级的搜索空间,并针对特定的硬件平台进行精度-延时平衡优化,在目标延时(~80ms)范围内进行搜索。随后利用NetAdapt方法来对每一层按照序列的方式进行调优。在尽量优化模型延时的同时保持精度,减小扩充层和每一层中瓶颈的大小。(局部搜索Small,如图9所示)

 图9 MoileNetV3-Small

NasNet论文地址:https://arxiv.org/pdf/1707.07012.pdf
MnasNet论文地址:https://arxiv.org/pdf/1807.11626.pdf

代码:

参考博客:Tensorflow2.0 keras MobileNet v1~v3 代码实现_wzx974528485的博客-CSDN博客_keras实现mobilenet

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值