CNN-day10-经典神经网络MobileNet V1&V2&V3
day11-经典神经网络MobileNet V1&V2&V3
一、MobileNet V1
1 网络简介
传统的卷积神经网络参数量大,导致预测时算力大,对于手机、嵌入式等移动设备来讲部署慢且占用空间,无法满足需求。
2017年,Google提出的移动端高效率模型MobileNet:相比VGG16,分类准确率下降了0.9%,但是模型参数仅仅是VGG16的1/32到1/33。
2 网络创新
2.1 Depth wise Convolution深度可分离卷积
DW卷积核的通道等于1,每个卷积核分别与输入特征每个channel进行卷积计算,从而得到输出特征矩阵的每个channel,总结:输入特征的channel = 卷积核个数 = 输出特征channel。
计算量相比于标准卷积降低了1个数量级,但没有有效利用不同通道在相同空间位置上的信息,鉴于此,我们需要再加一个PW卷积(Pointwise Conv,点卷积,大小1×1)
2.2常规卷积与DW卷积对比
3 整体结构
4 压缩比较
模型参数量与计算量压缩比较:
通常DW卷积和PW卷积是放在一起的,这种卷积比普通卷积能节省大量的计算量,论文中有相关公式求解计算量:分子为深度可分卷积的计算量,分母为普通卷积的计算量(步距默认为1):DW负责特征提取,PW负责特征融合
5 MobileNet 大小控制
Width multiplier 系数α:按比例减少通道数 Resolution multiplier 系数ρ:按比例降低特征图的大小
5.1宽度系数
Width multiplier系数α取值范围为(0,1],计算公式公式:
$$
D_K\cdot D_K\cdot\alpha M\cdot D_F\cdot D_F+\alpha M\cdot\alpha N\cdot D_F\cdot D_F
$$
$$
常取值为1,0.25,0.5,0.75,计算量与参数量大概按着\alpha^2比例下降。
$$
5.2分辨率系数
Resolution multiplier系数ρ取值范围为(0,1],计算公式如下:
$$
D_K\cdot D_K\cdot\alpha M\cdot\rho D_F\cdot\rho D_F+\alpha M\cdot\alpha N\cdot\rho D_F\cdot\rho D_F
$$
$$
网络输入分辨率通常为224,192,160,128,计算量与参数量大概按着\rho^2比例下降。
$$
5.3实验性能对比
6 V1存在的问题
使用ReLU后会造成信息丢失,通道少的特征图尤其明显:
对输入图像先通过随机矩阵T将数据转换为n维,后对n维数据进行ReLU操作,最后使用T的逆矩阵转换回来。当n很小,会导致很多信息的丢失,维度越高还原的图片和原图越相似。ReLU能够保持输入流形的完整信息,但前提是输入流形位于输入空间的低维子空间中。
当输出维度m=2,3时,信息坍塌,当m>15时,信息基本被保留。
二、MobileNet V2
MobileNet V1网络的Depth wise部分的卷积核容易参数为0,导致浪费掉。
MobileNet V2网络是由谷歌团队在2018年提出的,它对于MobileNet V1而言,有着更高的准确率和更小的网络模型。
1 网络的创新
-
整体采用MobileNet V1的通道可分离卷积来降低运量
-
采用ResNet思想,引入了特征复用结构,缓解特征退化问题(低精度训练尤其有效)
-
采用Inverted residual block结构,回避ReLU缺陷,通道数比较少的瓶颈层不采用非线性激活函数
1.1倒残差结构
先升维再降维,中间深两边浅
倒残差结构的过程是:
-
首先会通过一个1x1卷积层来进行升维处理,在卷积后会跟有BN和ReLU6激活函数
-
紧接着是一个3×3大小DW卷积,卷积后面依旧会跟有BN和ReLU6激活函数
-
最后一个卷积层是1x1卷积,起到降维作用,注意卷积后只跟了BN结构,并没有使用ReLU6激活函数。
在MobileNet V1中,DW卷积的个数局限于上一层的输出通道数,无法自由改变,但是加入PW卷积之后,也就是升维卷积之后,DW卷积的个数取决于PW卷积的输出通道数,而这个通道数是可以任意指定的,因此解除了3x3卷积核个数的限制。
1.2拓展因子t
瓶颈层到中间层通道数的提升比例
1.3ReLU6
在低维空间使用非线性函数(如ReLU)会损失一些信息,高维空间中会损失得相对少一些,引入Inverted Residuals升维之后再卷积,能够更好地保留特征。
V2卷积之后的激活函数是ReLU6,输入小于0时,结果为0,输入大于6时:结果为6。在0到6之间时:y=x。
$$
y=ReLU6(x)=min(max(x,0),6)
$$
1.4Shortcut
残差结构提出的Shortcut
shortcut将输入与输出直接进行相加,可以使得网络在较深的时候依旧可以进行训练。
这里只有stride=1且输入特征矩阵与输出特征矩阵shape相同时才有shortcut连接。
2 模型结构
第一层是标准卷积,后面是前述的瓶颈结构。其中t是扩展因子,c是输出通道数,n是重复次数,s代表步长。
三、MobileNet V3
[1905.02244] Searching for MobileNetV3
在现在比较流行一些边缘终端上,以MobileNetV3为识别网络或者为骨干网络是比较常用的。在相同延时下,MobileNet V3准确率更高。
MobileNetV3提出了large和small两个版本(区别在于网络结构不同),paper中讲在MobileNetV3 Large在ImageNet分类任务上,较MobileNetV2,TOP1准确率提高了大约3.2%,时间减少了20%。与具有同等延迟的MobileNetV2模型相比,Mobile NetV3 Small的准确率高6.6%。
1 网络的创新
1.1更新Block
加入SE模块(注意力机制),更新了激活函数
1.1.1加入SE模块
在MobileNetV2中,采用了倒残差结构:
-
首先会通过一个1x1卷积层来进行升维处理,在卷积后会跟有BN和ReLU6激活函数
-
紧接着是一个3x3大小DW卷积,卷积后面依旧会跟有BN和ReLU6激活函数
-
最后一个卷积层是1x1卷积,起到降维作用,注意卷积后只跟了BN结构,并没有使用ReLU6激活函数。
当stride=1且输入特征矩阵=输入特征矩阵时,还有shortcut结构。
MobileNetV3中的某些层中(注意不是全部),在进行最后一个1x1卷积之前,要进行一个SE模块注意力机制,针对于得到的特征矩阵,对每一个channel进行池化处理,有多少channel,得到的池化后的一维向量就有多少个元素,接下来通过第一个全连接层,这个全连接层的节点个数=特征矩阵channel的1/4,接下来是第二个全连接层,它的节点个数=特征矩阵channel。所以SE模块可以理解为:对特征矩阵的每个channel分析出一个权重关系,它把比较重要的channel赋予更大的权重值,把不那么重要的channel赋予比较小的权重值。
1.1.2更新激活函数
激活函数用了NL进行表示,NL指的是非线性激活函数,在不同的层中,使用了不同的激活函数,所以只是用了NL进行表示具体哪一层用了什么激活函数,会在网络的结构中指出。
在很多网络中,使用的是swish x激活函数,swish x激活函数就是x乘以sigmoid激活函数,图像如下图右侧图的虚线所示,它的公式是:
$$
swish x=x \cdot \sigma(x)
$$
$$
\mathrm{sigmoid}={\frac{1}{1+e^{-x}}}
$$
swish x激活函数确实可以提高准确性,但是计算以及求导过于复杂,同时对量化过程不太友好,量化过程是指在模型中,用更少的数据位宽来表示原始数据,达到节约资源,加快运算的目的,在MobileNetV3中,提出了一个h-swish[x]的激活函数
$$
\mathrm{h}-\mathrm{sigmoid}={\frac{\mathrm{ReLU6}(x+3)}{6}}
$$
h-sigmoid激活函数与sigmoid激活函数比较接近,但是公式要简单的多得多,那么在计算和求导时,就会快很多,所以在很多场合下,会用h-sigmoid激活函数替代sigmoid激活函数。
h-swish[x]激活函数
$$
\mathrm{h}-\mathrm{swish}[x]={x}\cdot{\frac{\mathrm{ReL}\mathrm{U}6({x}+3)}{6}}
$$
h-swish[x]激活函数其实是x乘以h-sigmoid激活函数,h-swish[x]激活函数与swish x激活函数非常相似,而且公式更为简单,没有幂运算,计算速度更快,同时对量化过程更加友好。
模型的前一半层使用常规ReLU(第一个conv层之后的除外)。h-swish[x]激活函数仅在更深层次上有用。此外,考虑到特征图在较浅的层中往往更大,因此计算其激活成本更高,所以作者选择在这些层上简单地使用ReLU(而非ReLU6),因为它比h-swish省时。
1.2使用NAS搜索参数
NAS是Neural Architecture Search,实现网络结构搜索,由资源受限的 NAS 执行整体模块结构搜索。过去神经网络搜索都是针对一个卷积模块内部的结构进行搜索,然后网络各层重复利用这个模块,这种方法潜在的问题是会失去模块与模块(层与层)之间的多样性,而层的多样性对于实现高精度和低延迟非常重要。
MobileNetV3将网络以倒残差模块为单位分解为独立的块,然后为每一个块在宏观上搜索网络结构,这样将会允许不同的块使用不同的宏观结构。例如,在网络的早期阶段(靠近输入的几层),通常会处理大量的数据,这些层关于延迟的影响要比远离输入的层大得多,所以对比后面的层应该有不同的结构。
在执行 NAS 网络搜索时,MobileNet v3 采用的是强化学习求解多目标优化问题(accuracy 和 latency)。
使用资源受限的 NAS 执行整体模块结构搜索后,MobileNet v3 继续使用 NetAdapt 算法对各层的结构进行精调。这个过程主要是在 NAS 搜索得到的网络基础上,对网络的某一层生成一些新的待选结构,先测试新的结构是否能降低延迟,在此基础上对能降低延迟的结构再测试其对应的模型准确率,最后选择的是最优的结构。总体来说,NetAdapt 实现了两个结果:
-
降低了倒残差模块 Expansion Layer 的大小;
-
降低了倒残差模块 Projection Layer 的大小,让模型各层 Projection Layer 大小相同,保证各层都使用残差连接。
使用NAS搜索参数原理部分转载自:https://zhuanlan.zhihu.com/p/450940875。
1.3重新设计耗时层
1.3.1减少C1层卷积核个数
MobileNetV3将第一层卷积的卷积核个数由32个减少到16个,准确率是一样的,但是会节省2ms的时间。
1.3.2精简Last Stage
提出Efficient Last Stage,在进行第一个卷积之后,直接就进行了池化,然后跟着两个卷积层进行输出,相对于原来的结构,节省了7ms的时间,占据了整个推理过程的11%的时间。
2 网络问题
更关注的是网络在Android设备上的表现,事实也的确如此,作者主要针对Google Pixel硬件对网络做了参数优化。可能会出现V3准确率不如V2的情况,它无法再其他一些设备上达到最佳效果。