研究轻量级基础性网络对研究实时的语义分割或者目标检测任务都具有一定的启发。尤其当你需要将网络安置在一些嵌入式平台上时。例如我就一般需要放在NVIDIA TEGRA TX2(Jetson)上运行。
paper的两个创新点在标题上说的已经很明白了 MobileNetV2: Inverted Residuals and Linear Bottlenecks
1.Depthwise Separable Convolutions(深度可分离卷积)
在mobilenet v1版本就使用过的卷积方式,来源于Xception。
Depthwise Separable Convolutions对于很多高效的卷积神经网络来说都是关键的组成部分。基本思想是替代全卷积操作的分解版本(例如把3*3分解成3*1与1*3的形式,这样可以减少卷积核1/3的参数),将一个卷积层分成两个独立的层。第一层是depthwise convolution主要用来提特征,第二层是pointwise convolution(1*1 convolution)主要用来升降维度。
输入一个hi * wi * di的 tensor Li, 卷积核。得到了一个输出为hi * wi * dj 的tensor Lj。
标准卷积计算花费为hi * wi * di * dj * k * k。若用Depthwise Separable Convolutions得到了计算花费则为:
hi * wi * di * k * k + hi * wi * di * dj = hi * wi * di * ( + dj)。 上下两式做比得 * dj / ( + dj ) 。一般dj 远大于 。所以可以看出标准卷积计算花费大概比Depthwise Separable Convolutions的计算花费 多8到9倍(按照k 一般 取 3计算)。这样大大减少了计算量并且准确率只有一点点的减少。
2.Linear Bottlenecks(本文主要创新点之一)
为了说明这一块,我有个直观的理解。例如一张真实图像,由R G B三通道组成,这三个通道包含了图像全部的信息。当我们通过卷积操作得到高维的tensor ,假如说是 16维时,这16个channels就包含了所提取出的图像的特征的所有信息,以此类推 32维, 64维等等。什么意思呢?就是说低维度的tensor其实已经包含了高维度tensor的所有信息。那么在低维度加ReLU函数进行激活时,就会失去一些信息。(当使用ReLu对某通道进行处理后,该通道不可避免的丢失信息)。为何使用ReLu?使用ReLu可以增加模型的稀疏性(人大脑的单侧抑制特性)。过于稀疏,信息就丢失了。
文章给的图数据说明如下:
可以很清楚的看到,input的在2,3维经过ReLu.信息丢失严重,随着维度的升高,信息丢失严重程度减少。
所以Linear Bottlenecks就是说在低维度时不宜进行ReLu等非线性处理。
带斜线的立方体表示不含非线性(不包含ReLu等非线性函数)
额外注释一下ReLu6函数:ReLu6限制了最大输出值为6,这是为了在移动设备上float16 / int 8低精度的时候也能有很好的数值分辨率。如果用ReLu函数,激活范围没有限制。那么移动设备上无法很好精确描述这么大范围的值,会带来精度损失。
3.Inverted Residuals(本文主要创新点之一)
受前面Linear Bottlenecks的启发,在低维度时使用ReLu函数会带来信息的丢失,在高维度时使用ReLu函数,某通道丢失的信息可能保存在其他通道中。所以提出了反向残差块结构Inverted Residuals。对比于传统瓶颈残差块的两头大中间小(主要是为了减少中间的卷积操作计算量),本文则是两头小,中间大。两头小并且不加ReLu函数可以减少对低维度带来的信息损失,中间大但是用Depthwise Separable Convolutions可以大大减少计算量。个人觉得这种新型的瓶颈残差块结构非常有意思。
同样带斜线的立方体表示不含非线性(不包含ReLu等非线性函数)。
4.Mobilenet V2网络结构
以输入图像为224 * 224 *3 为例, t 表示 反向残差块中间的扩张通道倍数, C表示通道数,n 表示重复次数,s表示步长(第一次为表格的步长数,后面均为1)。一共有19层网络(不包含输入和输出)。
5.mobilenet v1 和 v2的结构对比
MobileNet V2采用右边的块解决下采样问题(输入输出不一致无法shortcut连接)
左边解决输入输出一致(可以shortcut连接)