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 1∗1∗64∗128,作者如果采用bottleneck,那么在入口处加入Expansion layer,计算量为 1 ∗ 1 ∗ m ∗ 64 1*1*m*64 1∗1∗m∗64,m可以与远小于64,在出口处加入Projection layer,计算量为 1 ∗ 1 ∗ 64 ∗ n 1*1*64*n 1∗1∗64∗n,n可以远小于64,在下一个bottleneck处,在入口处加入Expansion layer,计算量为 1 ∗ 1 ∗ n ∗ 128 1*1*n*128 1∗1∗n∗128,n可以与远小于128,在出口处加入Projection layer,计算量为 1 ∗ 1 ∗ 128 ∗ p 1*1*128*p 1∗1∗128∗p,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网络端部最后阶段