原文: MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
论文链接:https://arxiv.org/abs/1704.04861
开源测试代码与预训练模型(caffe版本):https://github.com/shicai/MobileNet-Caffe
原文链接:https://blog.csdn.net/hongbin_xu/article/details/82957426
1、四个问题
1.1、要解决什么问题?
在现实场景下,诸如移动设备、嵌入式设备、自动驾驶等等,计算能力会受到限制,所以本文的目标就是构建一个小且快速(small and low latency)的模型。
1.2、用了什么办法解决?
提出了MobileNet架构,使用深度可分离卷积(depthwise separable convolutions)替代传统卷积。
在MobileNet网络中还引入了两个收缩超参数(shrinking hyperparameters):宽度乘子(width multiplier)和分辨率乘子(resolution multiplier)。
1.3、效果如何?
在一系列视觉任务如ImageNet分类、细粒度分类、目标检测等等上,显著降低模型大小的同时也取得了不错的效果。
1.4、还存在什么问题?(参考自知乎)
MobileNet v1的结构过于简单,是类似于VGG的直筒结构,导致这个网络的性价比其实不高。如果引入后续的一系列ResNet、DenseNet等结构(复用图像特征,添加shortcuts)可以大幅提升网络的性能。
Depthwise Convolution存在潜在问题,训练后部分kernel的权值为0。
2、网络结构
2.1、Depthwise Separable Convolution
2.1.1、标准卷积
2.1.2、深度可分离卷积
分为两部分:depthwise卷积和pointwise卷积。
depthwise卷积:对每个输入通道单独使用一个卷积核处理。
pointwise卷积:1×1 1 \times 11×1卷积,用于将depthwise卷积的输出组合起来。
2.1.3、标准卷积与深度可分离卷积计算量的比较
Depthwise Separable Convolution结构如下:
备注:
在Mobile v1里面使用ReLU6,ReLU6就是普通的ReLU但是限制最大输出值为6(对输出值做clip),这是为了在移动端设备float16的低精度的时候,也能有很好的数值分辨率,如果对ReLU的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的float16无法很好地精确描述如此大范围的数值,带来精度损失。
2.2、MobileNet结构
2.4、控制MobileNet模型大小的两个超参数
2.4.1、宽度因子(Width Multiplier):更薄的模型
如果需要模型更小更快,可以定义一个宽度因子,这个宽度因子可以让网络的每一层都变的更薄。如果input的channel是就变为,如果output channel是N就变为,那么在有宽度因子情况下的深度分离卷积运算的计算量公式就成了如下形式:
,一般取值为1,0.75,0.5或者0.25。如果为1就是基本的mobilenet,如果小于1就是缩减了的mobilenet。宽度因子会缩小网络的计算量和参数,能够让原来的模型变成一个更小的模型,但是在精确度和模型尺寸之间需要权衡。而且如果修改了宽度因子,网络需要重头开始训练。
该参数用于控制特征图的维数,即通道数。
2.4.2、分辨率因子(Resolution Multiplier):减少表达力
第二个减少计算量的超参数就是分辨率因子,这个因子是和input的长宽相乘,会缩小input的长宽而导致后面的每一层的长宽都缩小。
,一般让input的长宽为224,192,160和128。
该参数用于控制特征图的宽/高,即分辨率。