Depthwise Separable Convolution

MobileNet是基于深度可分离卷积的。通俗的来说,深度可分离卷积干的活是:把标准卷积分解成深度卷积(depthwise convolution)和逐点卷积(pointwise convolution)。这么做的好处是可以大幅度降低参数量和计算量。分解过程示意图如下:

其实就是把特征图按照通道数进行分割,比如N*H*W*C的特征图分割成C个N*H*W的二维特征图,然后进行卷积。以下是从公式上对其进行计算,懒得看的可以直接跳过,后面有更直观的解释。

标准卷积和深度可分离卷积的区别

深度分类卷积示例

黑色的输入为(6,6,3) 与第n 个卷积核对应,每个通道对应每个卷积核通道卷积得到输出,最终输出为2+0+1=3。(这是常见的卷积操作,注意这里卷积核要和输入的通道数相同,即图中表示的3个通道~)

对于深度分离卷积,把标准卷积(4,4,3,5) 分解为:

深度卷积部分:大小为(4,4,1,3) ,作用在输入的每个通道上,输出特征映射为(3,3,3)

逐点卷积部分:大小为(1,1,3,5) ,作用在深度卷积的输出特征映射上,得到最终输出为(3,3,5)

例中深度卷积卷积过程示意图如下:

从另一个形式来展示深度可分离卷积的过程:

标准的卷积过程可以看上图,一个2×2的卷积核在卷积时,对应图像区域中的所有通道均被同时考虑,问题在于,为什么一定要同时考虑图像区域和通道?我们为什么不能把通道和空间区域分开考虑?

深度可分离卷积提出了一种新的思路:对于不同的输入channel采取不同的卷积核进行卷积,它将普通的卷积操作分解为两个过程。

卷积过程

Depthwise 过程

Pointwise 过程

优势与创新

Depthwise+Pointwise可以近似看作一个卷积层:

  • 普通卷积:3x3 Conv+BN+ReLU
  • Mobilenet卷积:3x3 Depthwise Conv+BN+ReLU 和 1x1 Pointwise Conv+BN+ReLU

计算加速

参数量降低

假设输入通道数为3,要求输出通道数为256,两种做法:

1.直接接一个3×3×256的卷积核,参数量为:3×3×3×256 = 6,912

2.DW操作,分两步完成,参数量为:3×3×3 + 3×1×1×256 = 795(3个特征层*(3*3的卷积核)),卷积深度参数通常取为1

Network Structure and Training

标准卷积和MobileNet中使用的深度分离卷积结构对比如下:

注意:如果是需要下采样,则在第一个深度卷积上取步长为2.

MobileNet的具体结构如下(dw表示深度分离卷积):

除了最后的FC层没有非线性激活函数,其他层都有BN和ReLU非线性函数.

我们的模型几乎将所有的密集运算放到1×1 1×11×1卷积上,这可以使用general matrix multiply (GEMM) functions优化。在MobileNet中有95%的时间花费在1×1 1×11×1卷积上,这部分也占了75%的参数:

剩余的其他参数几乎都在FC层上了。

在TensorFlow中使用RMSprop对MobileNet做训练,使用类似InceptionV3 的异步梯度下降。与训练大型模型不同的是,我们较少使用正则和数据增强技术,因为小模型不易陷入过拟合;没有使用side heads or label smoothing,我们发现在深度卷积核上放入很少的L2正则或不设置权重衰减的很重要,因为这部分参数很少。

对于这个宽度因子和分辨率因子一开始还有点看不懂,其实这个就相当于建立了一个新的网络,这个新的网络的通道数跟分辨率与原来的有一定的裁剪,比如原来第五层有512个通道,现在变成256进行训练,而不是在原来的网络上进行更改。

下面的示例展现了宽度因子和分辨率因子对模型的影响:

第一行是使用标准卷积的参数量和Mult-Adds;第二行将标准卷积改为深度分类卷积,参数量降低到约为原本的1/10,Mult-Adds降低约为原本的1/9。使用α和ρ参数可以再将参数降低一半,Mult-Adds再成倍下降。

轻量级网络MobileNet v2

一、MobileNet v1 的不足

Relu 和数据坍缩

简单说一下上图:对于一个输入图像,首先通过一个随机矩阵T将数据转换为n维,然后对这n维数据进行ReLU操作,最后再使用T的逆矩阵转换回来,实验发现当n很小的时候,后面接ReLU非线性变换的话会导致很多信息的丢失,而且维度越高还原的图片和原图越相似。

ResNet 、Relu 和神经元死亡

在神经网络训练中如果节点的值变为0就会“死掉”。因为ReLU对0值的梯度是0,后续无论怎么迭代这个节点的值都不会恢复了。而通过ResNet结构的特征复用,可以很大程度上缓解这种特征退化问题(这也从一个侧面说明ResNet为何好于VGG)。另外,一般情况训练网络使用的是float32浮点数;当使用低精度的float16时,这种特征复用可以更加有效的减缓退化。

二、Inverted residual block

理解之前的问题后看,其实Mobilenet V2使用的基本卷积单元结构有以下特点:

  • 整体上继续使用Mobilenet V1的Separable convolution降低卷积运算量
  • 引入了特征复用结构,即采取了ResNet的思想
  • 采用Inverted residual block结构,对Relu的缺陷进行回避

Inverted residuals 可以认为是residual block的拓展,其重点聚焦在残差网络各层的层数,进入block后会先将特征维数放大,然后再压缩回去,呈现梭子的外形,而传统残差设计是沙漏形,下面是MobileNetV1、MobileNetV2 和ResNet微结构对比:

后面又看了点文章,觉得有必要加上,对MobileV1 & MobileNetV2有更清晰的描述。

MobileNetV2:Inverted Residuals and Linear Bottlenecks

1、主要改进点

  • 引入残差结构,先升维再降维,增强梯度的传播,显著减少推理期间所需的内存占用(Inverted Residuals)
  • 去掉 Narrow layer(low dimension or depth) 后的 ReLU,保留特征多样性,增强网络的表达能力(Linear Bottlenecks)
  • 网络为全卷积的,使得模型可以适应不同尺寸的图像;使用 RELU6(最高输出为 6)激活函数,使得模型在低精度计算下具有更强的鲁棒性
  • MobileNetV2 building block 如下所示,若需要下采样,可在 DWise 时采用步长为 2 的卷积;小网络使用小的扩张系数(expansion factor),大网络使用大一点的扩张系数(expansion factor),推荐是5~10,论文中 t=6。

2、和 MobileNetV1 的区别

3、和 ResNet 的区别

文章1:blog.csdn.net/u01197463

文章2:cnblogs.com/hellcat/p/9

文章3:cnblogs.com/hellcat/p/1

文章4:blog.csdn.net/u01197463

文章5:blog.csdn.net/mzpmzk/ar