mobilenet v1,v2,v3的理解

mobilenet v1

mobilenet的特点在于inference的速度非常快。拿ssd为例,如果mobilenet作为backbone的速度大概是vgg作为backnobe的3倍,因此它是可以在移动端落地的网络。但是凡事都有两面性,在相同的数据集下,比如今年公开的open image 数据集下,很多类别在100-200个epoch后,mobilenet的map通常要比vgg低20个点左右。

接下来就详细说一下mobilenet快的原因。
在这里插入图片描述

1)首先mobilenet做的一个工作相当于把卷积核拆分。
例如如果在某一层需要的是256个通道的3X3的卷积核,那么作者的思路就是把它拆分成1个通道的3X3的卷积核以及256个通道的1X1的卷积核。经过这样的拆分,可以将参数量变为原来的九分之一。这也就是为什么参数量,也就是模型大小变小的原因。
2)逐点卷积
逐点卷积也就是1)中说的1X1的卷积,因为在神经网络中,通道数通常可以达到64或者256,因此基本上所有的参数都集中在了逐点卷积中,当然计算量也基本上都集中在这了这一部分,计算量大概占了总体的百分之九十四,参数大概占了总体的百分之七十五。
3)精度
作者在imagenet上的测试显示,这样分解网络后,准确率只从百分之70降到百分之六十九。在检测任务中,以mibilenet作为backbone比起vgg来说,faster rcnn在coco数据集上也只下降6个点左右。
4)mobilenetv1为了进一步减少计算量,引入了两个超参数 α \alpha α ρ \rho ρ,计算量如下图所示:
在这里插入图片描述其中 D k D_k Dk表示滤波器的尺寸, D F D_F DF表示输入的分辨率 M M M表示输入的通道数, D D D表示输出的通道数。这两个参数肯定会影响模型的准确率,算是为了处理速度的一个折中

mobilenet v2

mobilenetv2 总的说来有三个改进
1)加入残差结构inverted residual
在这里插入图片描述

在mobilenetv1的时候,是将vgg做的拆解,并没有用到残差结构,为了防止梯度消失,v2加入了残差结构inverted residual,这样函数变为 f ( x ) + x f(x)+x f(x)+x,对他求导,得到 f , ( x ) + 1 f^,(x)+1 f,(x)+1,因为常数1存在,梯度不会消失。
2)采用了bottleneck
在这里插入图片描述

为了进一步将少参数,加快速度,作者还设计了bottleneck的概念,即在入口和出口处,用少通道的方法,在瓶子内部采用多通道增大映射空间。
举个例子,如果在mobilenetv1中输入输出为64和128,那么v1中的逐点卷积就是 1 ∗ 1 ∗ 64 ∗ 128 1*1*64*128 1164128,作者如果采用bottleneck,那么在入口处加入Expansion layer,计算量为 1 ∗ 1 ∗ m ∗ 64 1*1*m*64 11m64,m可以与远小于64,在出口处加入Projection layer,计算量为 1 ∗ 1 ∗ 64 ∗ n 1*1*64*n 1164n,n可以远小于64,在下一个bottleneck处,在入口处加入Expansion layer,计算量为 1 ∗ 1 ∗ n ∗ 128 1*1*n*128 11n128,n可以与远小于128,在出口处加入Projection layer,计算量为 1 ∗ 1 ∗ 128 ∗ p 1*1*128*p 11128p,p可以与远小于128,这样对于深度卷机来说chennl一致,但是计算量和参数量大大减少。
经过这样的进一步压缩,作者让mobilenet v2在cpu上也可以运行。
3)在逐点卷积后面的relu替换成线性函数
在这里插入图片描述

针对mobilenet v1,作者发现在通道数少的情况下不应该接relu这个激活函数,会造成大量节点变0的情况,而经过了bottleneck的改进,逐点卷积的通道数进一步减少,因此作者提出了,在通道数较少的层仅仅采用线性函数,而取消了非线性的relu激活。

mobilenetv3

mobilenetv3总的来说做了以下几点改进

0.网络的架构基于NAS实现的MnasNet(效果比MobileNetV2好)
1.引入MobileNetV1的深度可分离卷积
2.引入MobileNetV2的具有线性瓶颈的倒残差结构
3.引入基于squeeze and excitation结构的轻量级注意力模型(SE)
4.使用了一种新的激活函数h-swish(x)
5.网络结构搜索中,结合两种技术:资源受限的NAS(platform-aware NAS)与NetAdapt
6.修改了MobileNetV2网络端部最后阶段

网络的架构基于NAS实现的MnasNet

用一个强化学习来搜索一个深度卷积神经网络,但主要优化目标有两个,识别准确率和 CPU 运算延迟。具体的搜索策略见下图,可以确定的一点是,搜索得到的mnasnet性能比mobilenetv2性能要好。
在这里插入图片描述

squeeze and excitation结构

由于第1点就是mobilenetv1的精华,2点就是mobilenetv2的精华,前面篇幅已经介绍,这里跳过,讲一下SEnet,这是注意力机制,也就是在mobilenetv3的某些bottleneck中加入senet的逻辑,对不同的通道加权,使重要的通道权重更大,不重要的通道权重变小,如下图所示:
在这里插入图片描述
SENet增加的部分是U后的结构:对U先做一个Global Average Pooling(图中的Fsq(.),作者称为Squeeze过程),输出的1x1xC数据再经过两级全连接(图中的Fex(.),作者称为Excitation过程),最后用sigmoid(论文中的self-gating mechanism)限制到[0,1]的范围,把这个值作为scale乘到U的C个通道上, 作为下一级的输入数据。

使用了一种新的激活函数h-swish(x)

在这里插入图片描述
V3利用swish当作为ReLU的替代时,它可以显著提高神经网络的精度。但是呢,作者认为这种非线性激活函数虽然提高了精度,但在嵌入式环境中,是有不少的成本的。可以用一个近似函数来逼急这个swish,让swish变得硬(hard),也就是基于ReLU6的h-swish。

资源受限的NAS(platform-aware NAS)与NetAdapt

资源受限的NAS,用于在计算和参数量受限的前提下搜索网络来优化各个块(block),所以称之为模块级搜索(Block-wise Search) 。

NetAdapt,用于对各个模块确定之后网络层的微调每一层的卷积核数量,所以称之为层级搜索(Layer-wise Search)。

修改了MobileNetV2网络端部最后阶段


在这里插入图片描述

参考:moblienetv1、moblienetv2、mobilenetv3发展历程

猜你喜欢

转载自blog.csdn.net/lanmengyiyu/article/details/91354490