cnn经典网络-MobileNet V1 V2 深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

转自 https://www.cnblogs.com/yanshw/p/12563872.html

https://blog.csdn.net/flyfish1986/article/details/97017017

MobileNetV1

paper https://arxiv.org/abs/1704.04861

MobileNet 由谷歌在 2017 年提出,是一款专注于在移动设备和嵌入式设备上的 轻量级 CNN神经网络,并 迅速 衍生了 v1 v2 v3 三个版本;

相比于传统的 CNN 网络,在V1 就是 把 标准卷积层 换成了 深度可分离卷积;准确率小幅降低的前提下,大大减小模型参数和运算量;

模型亮点:

1. 深度可分离卷积,大大减少参数量

2. 增加超参 α、β 

常规卷积操作

对于一张5×5像素、三通道(shape为5×5×3),经过3×3卷积核的卷积层(假设输出通道数为4,则卷积核shape为3×3×3×4,最终输出4个Feature Map,

如果有same padding则尺寸与输入层相同(5×5),如果没有则为尺寸变为3×3

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

卷积层共4个Filter,每个Filter包含了3个Kernel,每个Kernel的大小为3×3。

因此卷积层的参数数量可以用如下公式来计算:

N_std = 4 × 3 × 3 × 3 = 108

可分离卷积

可分离卷积大致可以分为 空间可分离 和 深度可分离

空间可分离

顾名思义,就是把一个 大卷积核 换成两个 小卷积核,例如;

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

非本文重点,简单介绍;

深度可分离卷积

深度可分离 由 深度卷积 + 逐点卷积 组成;

深度卷积:Depthwise Convolution ,就是 把 卷积核 变成 单通道,输入有 M 个通道数,就需要 M 个卷积核,每个通道 分别进行卷积,最后做叠加,如下图

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

其中一个Filter只包含一个大小为3×3的Kernel,卷积部分的参数个数计算如下:N_depthwise = 3 × 3 × 3 = 27

Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法扩展Feature map。

而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的feature信息。

因此需要Pointwise Convolution来将这些Feature map进行组合生成新的Feature map。

逐点卷积:Pointwise Convolution,就是用 1x1 的卷积核进行卷积,作用是 对深度卷积后的 特征 进行 升维

Pointwise Convolution的运算与常规卷积运算非常相似,它的卷积核的尺寸为 1×1×M,M为上一层的通道数。

所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个卷积核就有几个输出Feature map

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

由于采用的是1×1卷积的方式,此步中卷积涉及到的参数个数可以计算为:

N_pointwise = 1 × 1 × 3 × 4 = 12

经过Pointwise Convolution之后,同样输出了4张Feature map,与常规卷积的输出维度相同

上面两步实现的效果如下图

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

可以看到输出 的 shape 是一样的;

下面我们看看在 输入输出 shape 一样时各自的参数量

标准卷积

params:Dk x Dk x M x N

计算量:Dk x Dk x M x Dh x Dw x N

可分离卷积

params:Dk x Dk x M + M x N

计算量:Dk x Dk x M x Dh x Dw + M x Dh x Dw x N

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

计算一下减少量

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

N 为 输出通道数, Dk 为 卷积核 size,如果 size 为 3,减小了 1/9 左右,厉害了;

V1 卷积结构

把 vgg 的标准卷积 和 V1 的深度可分离卷积 对比看下

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

看到了 深度卷积 (3x3 Depthwise)和逐点卷积 (1x1 conv);

同时看到了 Relu6,什么鬼?

Relu6 

上图,一看便知

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

Relu6 对 大于 0 的部分做了一个边界,作者认为,在模型精度要求不是很高的情况下,边界使得模型鲁棒性更强;

强行压缩数值比较大的特征,避免了 个性特征,也相当于规范了特征,防止过拟合,玄学要自己体会;

为了在移动端设备 float16/int8 的低精度的时候也能 有很好的数值分辨率。如果对 ReLU 的激活范围不加限制,输出范围为 0 到正无穷,如果激 活值非常大,分布在一个很大的范围内,则低精度的 float16/int8 无法很好地精确描述如此 大范围的数值,带来精度损失。

V1 网络结构

说了那么多,该上结果了

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

Conv 代表标准卷积,Conv dw 代表深度可分离卷积,s2 代表步长为2,s1 代表步长为1; 

V1 模型效果 

标准卷积是在 原特征 上进行多次卷积,而 深度可分离卷积 是在 卷积后的 特征上 进行 多次卷积,直观的感觉是,后者提取的特征不如前者,性能应该差点;

为了验证 V1 的效果,作者做了各种实验;

1. 分别用 标准卷积 和 深度可分离卷积 实现 MobileNetV1

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

可以看到 效果确实不如 标准卷积,但是 ACC 相差不大, 可喜的是 参数量和计算量 大大降低,约 1/9;

2. 把 V1 和 其他经典网络比较

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

ACC 优于 GoogleNet,差于 VGG16,但相差都不太大,但是参数量和计算量大大降低;

3. 把 V1 用于 目标检测算法

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

mAP 相差不是特别大,计算量大大降低; 

总结一句话,就是 V1 效果不输其他网络,但计算量和参数量大大降低;

超参数对比

MobileNet v1设置了两个超参数,用来控制模型的大小与计算量,具体如下:
·通道乘子width multiplier:用于控制特征图的通道数,记做α,当α<1时,模型会变得更薄,可以将计算量减少为原来的α2

·分辨率乘子resolution multiplier:用于控制特征图的尺寸,记做ρ,在相应的特征图上应用该乘子,也可以有效降低每一层的计算量。

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

缺点

使用中发现, depthwise 部分的卷积核很容易废掉,即卷积核参数大部分为 0;MobileNetV2 对此进行了分析和优化;

MobileNetV2

paper https://arxiv.org/abs/1801.04381

MobileNetV2 是由 谷歌 在 2018 年提出,相比 V1,准确率更好,模型更小;

模型亮点:

1. Inverted Residuals(倒残差结构)

2. Linear bottlenecks

MobileNet v1的深度可分离卷积 Block的结构

1、Depthwise convolution
2、Pointwise convolution

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

倒残差结构

MobileNet v2 的Block的结构
1、Pointwise convolution
2、Depthwise convolution
3、Pointwise convolution

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

MobileNet v2在Depthwise convolution之前添加一层Pointwise convolution,当加一层Pointwise convolution就可以升维,也可以降维。

在MobileNet v2中加的这一层是用做升维。Pointwise卷积升维之后,Depthwise卷积就可以在高维度工作。

这一层的Pointwise 卷积就可以叫expansion卷积,这一层就可以叫expansion layer,因为它用来升维了。

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

升了多少倍或者说通道扩大了多少倍就有了expansion factor。这里144/24=6那么6就是expansion factor膨胀系数,扩散系数,膨胀因子)

当我们看到MobileNet v2论文中的网络结构是就容易理解了
下图中的t表示就是expansion factor 用来表示通道扩张倍数,c表示输出通道数,n表示重复次数,s表示步长stride

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

为什么叫做倒残差结构?

一看到 残差,就想到 resnet 了,先来看看 resnet 的 residual block

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

我们看右边的 block,在 resnet 中 这个 block 专为 深层网络设计,可大大减少 参数量;

它先 通过 1x1 把 256 channel 变成 64  做降维,然后是 3x3 conv,再接着 1x1 还原为 256 channel 做升维;

总结一句残差结构:先降维再升维,两头胖,中间瘦;

而      倒残差结构:先升维再降维,两头瘦,中间胖;

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

MoblileNet v2 论文中的是这样表示的

第一行的升维叫 Expansion Layer
第二行的卷积叫 Depthwise Layer
第三行的降维叫 Projection Layer

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

 

那么为什么要加一层Pointwise convolution?

答案是MobileNet v1的深度可分离卷积中的Depthwise卷积的Kernel数量取决于上一层的Depth,也就是Depthwise卷积自己没有改变通道数的能力。

 

Linear bottlenecks

我们看到上面的 残差结构 末尾 是 Linear 而不是 Relu,为什么呢?

之前的pointwise卷积是升维的,轮到最后的pointwise卷积就是降维,

作者经过研究,高维加个非线性挺好,低维要是也加非线性就把特征破坏了,不如线性的好,所以1*1后 不加ReLU6 ,改换线性。

发现在 V1 中 depthwise 中有 0 卷积的原因就是 Relu 造成的,换成 Linear 解决了这个问题

Relu 为什么被换掉

作者做了如下实验

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

作者把一个 二维 流形 数据【图1】 作为 输入, 然后 用不同维度的矩阵 T 把它映射到 高维,然后经过 Relu 输出,再把 输出 经过 T-1 还原成  二维,

发现,在 低维 【图2 3】 时,Relu 对信号的损失非常大,随着维度增加,损失越来越小;

结论就是 Relu 对低维信号 损失很大

回想一下 深度卷积,深度卷积是单通道卷积,只有 1 维,经过 relu 后,即使是 融合后再  Relu 也只有 3 维,信号损失很大,如果学到的信号完全没有用,那就不用学了, w 自然是 0 ;

问题又来了,既然 depthwise 时 relue 造成了信号损失,为什么不换 DW 的 relue,而是把 逐点卷积 的 激活函数 换成 Linear 了?

1. 首先 dw 的 relu 造成 大量损失是因为 Input 的 channel 太少了

如果 Input 的 channel 不少呢,就不损失了,那就没问题了,所以重点不是换不换 relue,是解决 低 channel 的问题;

2. 既然 channel 少,我给你增加 channel 不就好了,就是 1x1 升维咯;

3. 升完了,我再降回来,将回来之后, channel 就少了,那就换成 linear 咯;

4. 于是 倒残差结构 形成咯,再就是画道线的事,input与结果相加,参考 resnet 而已;

在具体网络设计时,经过试验,作者并不是把 所有 block 都加上了 残差结构,所以 V2 中有两种 block;

只有 Stride=1 时,才有 残差结构; stride为2时,因为input与output的大小不同,所以没有添加shortcut结构.

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

V2 网络结构

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485

V2 模型效果

cnn经典网络-MobileNet V1 V2
深度可分离卷积很详细的解释:https://zhuanlan.zhihu.com/p/92134485 

一句话,又好又快