目录
MobileNetV3
创新点:
SE模块
互补搜索技术组合
网络结构的改进
h-swish激活函数
4MobileNetV3网络结构
补充资料?
MobileNetV3
MobileNetV3主要使用了网络搜索算法(用NAS通过优化每个网络块来搜索全局网络结构,用NetAdapt算法搜索每个层的滤波器数量),同时在MobileNet V2网络结构基础上进行改进,并引入了SE模块以及H-Swish激活函数。
创新点
-
互补搜索技术组合:由资源受限的NAS执行模块级搜索,NetAdapt执行局部搜索。
-
网络结构改进:SE模块;将最后一步的平均池化层前移并移除最后一个卷积层,引入h-swish激活函数。
上面两张图是MobileNetV2和MobileNetV3的网络块结构。可以看出,MobileNetV3是综合了以下三种模型的思想:MobileNetV1的深度可分离卷积(depthwise separable convolutions)、MobileNetV2的具有线性瓶颈的逆残差结构(the inverted residual with linear bottleneck)和MnasNet的基于squeeze and excitation结构的轻量级注意力模型。
综合了以上三种结构的优点设计出了高效的MobileNetV3模块。
SE模块
SE结构会消耗一定的时间,SE瓶颈的大小与卷积瓶颈的大小有关。将它们全部替换为固定为膨胀层通道数的1/4,可以在适当增加参数数量的情况下提高精度,并且没有明显的延迟成本。
SE模块被放在了Depthwise卷积后面。
互补搜索技术组合
(1)资源受限的NAS(platform-aware NAS):计算和参数量受限的前提下搜索网络的各个模块,所以称之为模块级的搜索(Block-wise Search)。
(2)NetAdapt:用于对各个模块确定之后网络层的微调。
对于模型结构的探索和优化来说,网络搜索是强大的工具。研究人员首先使用了神经网络搜索功能来构建全局的网络结构,随后利用了NetAdapt算法来对每层的核数量进行优化。对于全局的网络结构搜索,研究人员使用了与Mnasnet中相同的,基于RNN的控制器和分级的搜索空间,并针对特定的硬件平台进行精度-延时平衡优化,在目标延时(~80ms)范围内进行搜索。随后利用NetAdapt方法来对每一层按照序列的方式进行调优。在尽量优化模型延时的同时保持精度,减小扩充层和每一层中瓶颈的大小。
网络结构的改进
MobileNetV2的inverted bottleneck结构是使用了1*1
卷积作为最后一层,以扩展到高维度的特征空间(也就是上图中的320->1280那一层的1*1
卷积)。这一层的计算量是比较大的。MobileNetV3为了减少延迟并保留高维特性,将该1*1
层移到最终的平均池化之后(960->Avg Pool->1*1
Conv)。现在计算的最后一组特征图从7*7
变成了1*1
,可以大幅度减少计算量。最后再去掉了Inverted Bottleneck中的Depthwise和1*1
降维的层,在保证精度的情况下大概降低了15%的运行时间。
h-swish激活函数
作者发现swish激活函数能够有效提高网络的精度。然而,swish的计算量太大了。作者提出h-swish(hard version of swish)如下所示:计算速度比Swish更快(但比ReLU慢),更易于量化,精度上没有差异。
h-swish如图所示
这种非线性在保持精度的情况下带了了很多优势,首先ReLU6在众多软硬件框架中都可以实现,其次量化时避免了数值精度的损失,运行快。这一非线性改变将模型的延时增加了15%。但它带来的网络效应对于精度和延时具有正向促进,剩下的开销可以通过融合非线性与先前层来消除。
MobileNetV3网络结构
作者提出了MobileNetV3-Large和MobileNetV3-Small两种不同大小的网络结构。如下图所示
补充资料
开源代码整理如下:
(1)PyTorch实现1:https://github.com/xiaolai-sqlai/mobilenetv3
(2)PyTorch实现2:https://github.com/kuan-wang/pytorch-mobilenet-v3
(3)PyTorch实现3:https://github.com/leaderj1001/MobileNetV3-Pytorch
(4)Caffe实现:https://github.com/jixing0415/caffe-mobilenet-v3
(5)TensorFLow实现:https://github.com/Bisonai/mobilenetv3-tensorflow