12.9深度学习_经典神经网络_ Mobilenet V3

发布于:2024-12-20 ⋅ 阅读:(8) ⋅ 点赞:(0)

一、 Mobilenet V3

1. 网络的背景

通过之前的课程,了解并学习了MobileNetV1和MobileNetV2的相关内容和网络节点,这一章节学习MobileNetV3的相关内容,在现在比较流行一些边缘终端上,以MobileNetV3为识别网络或者为骨干网络是比较常用的,下图是MobileNetV2和MobileNet3的比较图,横坐标是在在谷歌自己做的Pixel 1手机上的延迟,纵坐标是准确率,可以看出,在相同延时下,MobileNet V3准确率更高。

img src=".\media\29c1cf52a535ae3439b159b39dfa498e.png" style="zoom:50%;" />

MobileNetV3提出了large和small两个版本(区别在于网络结构不同),paper中讲在MobileNetV3 Large在ImageNet分类任务上,较MobileNetV2,TOP1准确率提高了大约3.2%,时间减少了20%。与具有同等延迟的MobileNetV2模型相比,Mobile NetV3 Small的准确率高6.6%。

注意:TOP1指的是得到的识别结果中可能性最高的那个预测值与真实值的准确率,对应的有TOP5。

论文地址:https://arxiv.org/abs/1905.02244

2. 网络的创新

2.1 更新Block

对Block的结构进行了更新,在其中加入了SE模块,即注意力机制,以及更新了激活函数。

2.1.1 加入SE模块

在MobileNetV2中,采用了倒残差结构,该结构如下图所示:

  1. 首先会通过一个1x1卷积层来进行升维处理,在卷积后会跟有BN和ReLU6激活函数
  2. 紧接着是一个3x3大小DW卷积,卷积后面依旧会跟有BN和ReLU6激活函数
  3. 最后一个卷积层是1x1卷积,起到降维作用,注意卷积后只跟了BN结构,并没有使用ReLU6激活函数。

当stride=1且输入特征矩阵=输入特征矩阵时,还有shortcut结构。

但是MobileNetV3中的某些层中(注意不是全部),在进行最后一个1x1卷积之前,要进行一个SE模块注意力机制,MobileNetV3的倒残差如下图所示:

可以在上图中很明显的看到圈出的红框内容,这是一个SE模块,这里的SE模块是一个通道注意力机制,即对通道进行特征注意。

**它的作用是针对于得到的特征矩阵,对每一个channel进行池化处理,有多少channel,得到的池化后的一维向量就有多少个元素,接下来通过第一个全连接层,这个全连接层的节点个数=特征矩阵channel的1/4,接下来是第二个全连接层,它的节点个数=特征矩阵channel。所以SE模块可以理解为:对特征矩阵的每个channel分析出一个权重关系,它把比较重要的channel赋予更大的权重值,把不那么重要的channel赋予比较小的权重值。**该过程举例如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

​ 上图中,Conv1是DW卷积后得到的特征矩阵,该特征矩阵共4个channel,当然实际上多得多,这里只是简单举例,对每个channel进行平均池化操作,得到一个向量,接下来要经过第一次全连接层,全连接层的激活函数为Relu,节点个数=1,即4个channel的1/4,接下来通过第二个全连接层和h-sigmoid激活函数,该激活函数在后续会讲到,节点个数为4,最后得到的向量要与Conv1的每一个元素进行相乘,例如Conv1左上角的0.2,与得到的第一个channel的系数0.5进行相乘,得到Conv2的左上角的0.1,以此类推,就完成了SE模块的功能。

2.1.2 更新了激活函数

​ 在新的Block结构中,更新了激活函数,在下图中的红框内可以看到,激活函数用了NL进行表示,NL指的是非线性激活函数,在不同的层中,使用了不同的激活函数,所以只是用了NL进行表示具体哪一层用了什么激活函数,会在网络的结构中指出。

​ 在MobileNetV2中,使用的几乎都是Relu6激活函数,但是在很多网络中,使用的是swish x激活函数,swish x激活函数就是x乘以sigmoid激活函数,图像如下图右侧图的虚线所示,它的公式是:

s w i s h x = x ⋅ σ ( x ) swish x=x \cdot \sigma(x) swishx=xσ(x)

其中,就是sigmoid激活函数,如下图中左侧图的虚线所示,公式为:

s i g m o i d = 1 1 + e − x \mathrm{sigmoid}={\frac{1}{1+e^{-x}}} sigmoid=1+ex1

swish x激活函数确实可以提高准确性,但是计算以及求导过于复杂,同时对量化过程不太友好,量化过程是指在模型中,用更少的数据位宽来表示原始数据,达到节约资源,加快运算的目的,在MobileNetV3中,提出了一个h-swish[x]的激活函数,这个函数看起来可能比较复杂,这里按步来进行分析。

首先列出Relu6激活函数的公式:

R e L U ( 6 ) = m i n ( m a x ( x , 0 ) , 6 ) ReLU(6)=min(max(x,0),6) ReLU(6)=min(max(x,0),6)

以此为灵感,并结合sigmoid激活函数的图像,提出了一个名为h-sigmoid激活函数,它其实就是将原本的Relu6进行了变换,图像如下图左侧图的实线所示,公式为:

h − s i g m o i d = R e L U 6 ( x + 3 ) 6 \mathrm{h}-\mathrm{sigmoid}={\frac{\mathrm{ReLU6}(x+3)}{6}} hsigmoid=6ReLU6(x+3)

可以看出h-sigmoid激活函数与sigmoid激活函数比较接近,但是公式要简单的多得多,那么在计算和求导时,就会快很多,所以在很多场合下,会用h-sigmoid激活函数替代sigmoid激活函数。

了解了h-sigmoid激活函数后,再来看论文中使用的名为h-swish[x]激活函数,图像如下图右侧图的实线所示,公式为:

h − s w i s h [ x ] = x ⋅ R e L U 6 ( x + 3 ) 6 \mathrm{h}-\mathrm{swish}[x]={x}\cdot{\frac{\mathrm{ReL}\mathrm{U}6({x}+3)}{6}} hswish[x]=x6ReLU6(x+3)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

h-swish[x]激活函数其实是x乘以h-sigmoid激活函数,可以从图像中看出,h-swish[x]激活函数与swish x激活函数非常相似,而且公式更为简单,没有幂运算,计算速度更快,同时对量化过程更加友好。

并非整个模型都使用了h-swish,模型的前一半层使用常规ReLU(第一个conv层之后的除外)。 为什么要这样做呢?因为作者发现,h-swish[x]激活函数仅在更深层次上有用。此外,考虑到特征图在较浅的层中往往更大,因此计算其激活成本更高,所以作者选择在这些层上简单地使用ReLU(而非ReLU6),因为它比h-swish省时。

2.2 使用NAS搜索参数

​ NAS是Neural Architecture Search,实现网络结构搜索,由资源受限的 NAS 执行整体模块结构搜索,该算法是在2018年 MnasNet 论文中提出的。过去神经网络搜索都是针对一个卷积模块内部的结构进行搜索,然后网络各层重复利用这个模块,例如 MobileNetV2 的 Bottleneck Residual Block。这种方法潜在的问题是会失去模块与模块(层与层)之间的多样性,而层的多样性对于实现高精度和低延迟非常重要。

​ MobileNetV3将网络以倒残差模块为单位分解为独立的块,然后为每一个块在宏观上搜索网络结构,这样将会允许不同的块使用不同的宏观结构。例如,在网络的早期阶段(靠近输入的几层),通常会处理大量的数据,这些层关于延迟的影响要比远离输入的层大得多,所以对比后面的层应该有不同的结构。

​ 在执行 NAS 网络搜索时,MobileNet v3 采用的是强化学习求解多目标优化问题(accuracy 和 latency)。

​ 使用资源受限的 NAS 执行整体模块结构搜索后,MobileNet v3 继续使用 NetAdapt 算法对各层的结构进行精调。这个过程主要是在 NAS 搜索得到的网络基础上,对网络的某一层生成一些新的待选结构,先测试新的结构是否能降低延迟,在此基础上对能降低延迟的结构再测试其对应的模型准确率,最后选择的是最优的结构。总体来说,NetAdapt 实现了两个结果:

  1. 降低了倒残差模块 Expansion Layer 的大小;
  2. 降低了倒残差模块 Projection Layer 的大小,让模型各层 Projection Layer 大小相同,保证各层都使用残差连接。

使用NAS搜索参数原理部分转载自:https://zhuanlan.zhihu.com/p/450940875

2.3 重新设计耗时层

在paper中,提出了一些为了减少网络计算时耗时所涉及的内容。

2.3.1 减少C1层卷积核个数

MobileNetV3将第一层卷积的卷积核个数由32个减少到16个,在paper中是这样介绍的,当第一层的卷积由32减少到16之后,准确率是一样的,但是会节省2ms的时间。

2.3.2 精简Last Stage

在网络结构的最后一个部分,原本是NAS搜索出来的Original Last Stage,如下图上面的图示流程,过程是:卷积->卷积->卷积->卷积->池化->卷积输出。但是在实际使用过程中发现该结构是比较耗时的。于是对该结构进行了精简,提出了Efficient Last Stage,如下图下面的图示流程,精简之后,在进行第一个卷积之后,直接就进行了池化,然后跟着两个卷积层进行输出,相对于原来的结构,节省了7ms的时间,占据了整个推理过程的11%的时间。

3. 网络问题

​ 在使用过程中,可能会出现MobileNetV3准确率不如MobileNetV2的情况,MobileNetV3是来自于Google的,自然它更关注的是网络在Android设备上的表现,事实也的确如此,作者主要针对Google Pixel硬件对网络做了参数优化。

​ 当然这并不意味着MobileNet V3就是慢的了,只不过它无法在其他一些设备上达到最佳效果。

4. 网络结构

在paper中的Table 1中给出了网络结构的图,如下图所示:

注意:本处展示的MobileNetV3-Large模型,虚拟仿真流程用该模型,small模型需自己去学习。

在上表中:

  • Input代表输入当前层的特征矩阵;

  • Operator代表操作(bneck就是倒残差结构,后面的3x3或者5x5就是DW卷积的卷积核大小,在最后两层有个NBN参数,NBN代表这两层无batchNorm,意味着其它层的Conv2D以及DWConv2D每一层之后都需要跟batchNorm);

  • exp size代表第一个升维的卷积所升到维度;

  • #out代表输出矩阵的channel;

  • SE代表这一层bneck是否使用注意力机制,对号代表使用;

  • NL代表激活函数的类别(HS是h-swish[x]激活函数,RE是Relu激活函数);

  • s代表步距,但是在bneck结构中指的是DW卷积的步距,其他层步距依然为1。

这里使用的数据集为ImageNet,所以k是1000。


网站公告

今日签到

点亮在社区的每一天
去签到