文章目录
开始之前首先学习一个单词热热身:
discernible [dɪˈsɜːnəbl]
adj. 看得清的; 辨别得出的;
论文链接:https://arxiv.org/pdf/1905.02244.pdf
前言
MobileNetV3,是谷歌在2019年3月21日提出的网络架构。作者提出MobileNetV3是基于互补搜索技术(complementary search technques)和新颖的网络结构设计的结合。摘要中说到用神经结构搜索(NAS)来完成V3,咱也不懂什么是NAS,暂且略过。。。
先上实验结果,证明V3版本确实有所作为。可以看到,在同一大小的计算量下,V3在ImageNet上的结果都是最好的。
![](https://i-blog.csdnimg.cn/blog_migrate/e9f150058649330ff8f811cbed1739ac.png#pic_center)
一、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网络端部最后阶段
其中第0点,关于MnasNet也是基于NAS的,丝毫不懂,只要认为MnasNet是一个比MobileNet精度和实时性更高的模型就好了。
其中第1点和第2点,已经在MobileNet前两个版本中学习过,不再赘述。
1.1 squeeze and excitation(SE)结构
在Ghost 轻量化网络方法【论文笔记】中已经学习过SEblock结构,这里仅仅搬运一下。
Sequeeze-and-Excitation(SE) block
并不是一个完整的网络结构,而是一个结构快,可以嵌入到其他神经网络模型中。SEblock
的核心思想在于通过网络根据loss
去学习特征权重,使得有效的feature map
权重大,无效或效果小的feature map权重小的方式训练模型达到更好的结果。
![](https://i-blog.csdnimg.cn/blog_migrate/4f7323b9733c801ded5382bb221b3a85.png#pic_center)
SEblock的工作就是将上图中左边的X
特征图经过一系列运算得到上图中右边彩色的x̅
,可将整个运算过程分为四步,接下来结合论文中的公式对这四个步骤做一个总结:
- Ftr:Ftr这一步是转换操作,实际上它并不属于SEblock,在原网络中这一步仅仅是一个标准的卷积操作而已;且后面可以看到在定义SqueezeExcite函数时没有这一步操作。
- Fsq:
x
经过 Ftr得到U
,U
为C个大小为H×W
的特征层,而uc表示U
中第c个二维矩阵特征层,下标c表示channel。接下来是Squeeze操作,也就是简单的一个global average pooling
:
![](https://i-blog.csdnimg.cn/blog_migrate/3f92ce9dd7646884e1d46a84f7e98875.png#pic_center)
所以 Fsq 操作将H×W×C
的输入转换成1×1×C
的输出,这一步相当于获取C个特征层的数值分布情况,或者叫全局信息。
-
Fex:这一步操作即是
Excitation
操作,计算过程将括号从里向外看。首先将第2步的结果Z乘以一个系数矩阵W1
,这是一个简单的全连接层操作,W1的维度是C/r × C
,这个r是一个缩放参数,目的是为了减少channel个数从而降低计算量z的维度是
1×1×C
,所以W1×z
的结果就是1×1×C/r
;然后再经过一个ReLU
层,输出维度不变;然后再与W2相乘,这也是一个全连接层操作。W2的维度是C×C/r
,因此输出的维度是1×1×C
;最后再经过sigmoid
函数得到结果s。这两个全连接层的作用就是融合各通道的feature map信息。
![](https://i-blog.csdnimg.cn/blog_migrate/0ec808d049e97680ca9601672e421df6.png#pic_center)
-
Fscale:第三步得到的结果s的维度是
1×1×C
。这个s其实是SEblock的核心,用它来刻画特征层U中的C个feature map的权重,而且这个权重是通过前面这些全连接层和非线性层学习得到的,因此可以end-to-end训练。在得到s之后,就可以对原来的特征层U进行操作,即
channel-wise multiplication
。uc是一个二维矩阵,sc是一个数,也就是权重,因此相当于把uc矩阵中的每个值都乘以sc,故特征层U中的C个特征图都被一个权重系数相乘。
![](https://i-blog.csdnimg.cn/blog_migrate/159d8e14b7e14c2245ae4e092463af4e.png#pic_center)
经过以上四步后,将原始特征层X
的每个通道分别乘以对应的权重系数,使得有效的特征图占比更大,无效或效果较小的特征图占比降低。整体来说仅仅是将特征图内的数值进行了调整,其大小及通道数均不发生改变。
1.2 激活函数 h-swish(x)
1.2.1 swish
h-swish是基于swish的改进,首先学习下swish激活函数,该函数是在谷歌大脑2017的论文Searching for Activation functions
所提出的。
![](https://i-blog.csdnimg.cn/blog_migrate/abe28697c5ee31fd7e19fffb83a872bf.png#pic_center)
Swish论文的作者认为,Swish具备无上界有下界、平滑、非单调的特性。并且swish在深层模型上的效果优于ReLU。仅仅使用Swish单元替换ReLU就能把MobileNet、NASNetA在 ImageNet上的top-1分类准确率提高0.9%。
1.2.2 h-swish
尽管swish可以提升模型精度,但是在MobileNetV3中并没有直接将ReLU替代为swish,作者解释Sigmoid激活函数在移动设备上计算时开销很大,毕竟此网络的设计宗旨还是要运行在移动设备或嵌入式设备中的,故作者通过两种方法来避免此问题。
- 可以用一个近似函数来逼急这个swish,从而避免Sigmoid的计算,使得swish变得硬(hard)。作者选择的是基于ReLU6,作者认为几乎所有的软件和硬件框架上都可以使用ReLU6的优化来逼近swish函数。
![](https://i-blog.csdnimg.cn/blog_migrate/ab539a56835212fbc387b40cf2d1f7c3.png#pic_center)
下图是Sigmoid和swish的hard、soft形式,可以看到swish和h-swish几乎无缝拟合。
![](https://i-blog.csdnimg.cn/blog_migrate/8ee76f7851a8b3c30c1b6ad4d5cdfe92.png#pic_center)
- 网络从输入到输出随着网络越来越深,特征图的分辨率也变得越来越小,所以随着网络的深入,应用非线性激活函数的成本会降低,能够更好的减少参数量。作者发现swish的大多数好处都是通过在更深的层中使用它们实现的。因此,在MobileNetV3的架构中,只在模型的后半部分使用h-swish(HS),前半部分仍然使用ReLU,具体可由之后的网络模型结构看到。
1.3 网络结构搜索NAS
这个点完全Ctrl + C参考博客中的内容,图个新鲜看一看,这部分感觉也没什么会留下记忆的点。
主要结合两种技术:资源受限的NAS(platform-aware NAS)与 NetAdapt。
资源受限的NAS:用于在计算和参数量受限的前提下搜索网络来优化各个块(block),所以称之为模块级搜索(Block-wise Search);
NetAdapt:用于对各个模块确定之后网络层的微调每一层的卷积核数量,所以称之为层级搜索(Layer-wise Search)。
一旦通过体系结构搜索找到模型,我们就会发现最后一些层以及一些早期层计算代价比较高昂。于是作者决定对这些架构进行一些修改,以减少这些慢层(slow layers)的延迟,同时保持准确性。这些修改显然超出了当前搜索的范围。
1.4 对MobileNetV2最后阶段的修改
作者认为,当前模型是基于V2模型中的倒残差结构和相应的变体。在MobileNetv2中,在avg pooling之前,存在一个1x1的卷积层,目的是提高特征图的维度,更有利于结构的预测,但是这其实带来了一定的计算量,所以这里作者对网络结构进行稍微的修改。
将下图绿框中的1×1Conv / H-Swich放在avg pooling的后面,首先利用avg pooling将特征图大小由7x7降到了1x1,之后再利用1x1提高维度,并且为了进一步降低计算量,作者直接去掉了前面的深度可分离卷积的3x3以及1x1卷积,进一步减少了计算量,修改后的结构如下图第二行所示。
![](https://i-blog.csdnimg.cn/blog_migrate/5601b9892dcf789267ffb0ae5fccc661.png#pic_center)
二、MobileNetV3结构
有人总结讲:MobileNet V3 = MobileNet v2 + SE + hard-swish activation + half initial layers channel & last block do global average pooling first
2.1 MobileNet V3 block
![](https://i-blog.csdnimg.cn/blog_migrate/5d37047a1c2fffbbf7ba8a0e71850efb.png#pic_center)
2.2 MobileNetV3网络结构
MobileNetV3定义了两个模型: MobileNetV3-Large和MobileNetV3-Small。V3-Large是针对高资源情况下的使用,相应的,V3-small是针对低资源情况下的使用。两者都是基于之前的简单讨论的NAS。
2.2.1 MobileNetV3-Large
![](https://i-blog.csdnimg.cn/blog_migrate/5911acbc3753134fc6f085ff46a7a24b.png#pic_center)
2.2.1 MobileNetV3-Small
![](https://i-blog.csdnimg.cn/blog_migrate/d265f2ae06161be9d2f90498f8c6f315.png#pic_center)
三、总结
MobileNet三个版本的详细总结呈上,最后再列出三个版本的创新点以梳理清思路:
3.1 MobileNetV1
- 标准卷积改为深度可分离卷积;
ReLU
改为ReLU6
;- 引入Width Multiplier(α)和Resolution Multiplier(ρ);
3.2 MobileNetV2
- 将深度可分离卷积中的1×1卷积后的ReLU替换成线性激活函数;
- 引入了Expansion layer,在进行深度分离卷积之前首先使用1×1卷积进行升维;
- 引入Shortcut结构,在升维的1×1卷积之前与深度可分离卷积中的1×1卷积之后进行shortcut连接;
3.3 MobileNetV3
- 引入基于squeeze and excitation结构的轻量级注意力模型(SE);
- 使用了一种新的激活函数h-swish(x);
- 网络结构搜索中,结合两种技术:资源受限的NAS(platform-aware NAS)与NetAdapt;
- 修改了MobileNetV2网络端部最后阶段;
欢迎关注【OAOA】