最详细的MobileNet_v1讲解

其实介绍MobileNetV1(以下简称V1)只有一句话,MobileNetV1就是把VGG中的标准卷积层换成深度可分离卷积就可以了。

那么,这个深度可分离卷积是什么?

深度可分离卷积

深度可分离卷积(depthwise separable convolution),根据史料记载,可追溯到2012年的论文Simplifying ConvNets for Fast Learning,作者提出了可分离卷积的概念(下图(a)):
在这里插入图片描述
可分离卷积主要有两种类型:空间可分离卷积和深度可分离卷积。

空间可分离

顾名思义,空间可分离就是将一个大的卷积核变成两个小的卷积核,比如将一个3×3的核分成一个3×1和一个1×3的核:
在这里插入图片描述
深度可分离卷积
在这里插入图片描述
深度可分离卷积就是将普通卷积拆分成为一个深度卷积和一个逐点卷积。

我们先来看一下标准的卷积操作:
在这里插入图片描述
输入一个12×12×3的一个输入特征图,经过5×5×3的卷积核卷积得到一个8×8×1的输出特征图。如果此时我们有256个特征图,我们将会得到一个8×8×256的输出特征图。

以上就是标准卷积干的活。那深度卷积和逐点卷积呢?

深度卷积
在这里插入图片描述
与标准卷积网络不一样的是,我们将卷积核拆分成为但单通道形式,在不改变输入特征图像的深度的情况下,对每一通道进行卷积操作,这样就得到了和输入特征图通道数一致的输出特征图。如上图:输入12×12×3的特征图,经过5×5×1×3的深度卷积之后,得到了8×8×3的输出特征图。输入个输出的维度是不变的3。这样就会有一个问题,通道数太少,特征图的维度太少,能获取到足够的有效信息吗?

逐点卷积

逐点卷积就是1×1卷积。主要作用就是对特征图进行升维和降维,如下图:
在这里插入图片描述
在深度卷积的过程中,我们得到了8×8×3的输出特征图,我们用256个1×1×3的卷积核对输入特征图进行卷积操作,输出的特征图和标准的卷积操作一样都8×8×256了。

标准卷积与深度可分离卷积的过程对比如下:
在这里插入图片描述

为什么要深度可分离卷积?

这个问题很好回答,如果有一个方法能让你用更少的参数,更少的运算,但是能达到差的不是很多的结果,你会使用吗?

深度可分离卷积就是这样的一个方法。我们首先来计算一下标准卷积的参数量与计算量(只考虑MAdd):
在这里插入图片描述
标准卷积的参数量

卷积核的尺寸是Dk×Dk×M,一共有N个,所以标准卷积的参数量是:
在这里插入图片描述
标准卷积的计算量

卷积核的尺寸是Dk×Dk×M,一共有N个,每一个都要进行Dw×Dh次运算,所以标准卷积的计算量是:
在这里插入图片描述
标准卷积算完了,我们接下来计算深度可分离卷积的参数量和计算量:
在这里插入图片描述
深度可分离卷积的参数量

深度可分离卷积的参数量由深度卷积和逐点卷积两部分组成:
深度卷积的卷积核尺寸Dk×Dk×M;逐点卷积的卷积核尺寸为1×1×M,一共有N个,所以深度可分离卷积的参数量是:
在这里插入图片描述
深度可分离卷积的计算量

深度可分离卷积的计算量也是由深度卷积和逐点卷积两部分组成:
深度卷积的卷积核尺寸Dk×Dk×M,一共要做Dw×Dh次乘加运算;逐点卷积的卷积核尺寸为1×1×M,有N个,一共要做Dw×Dh次乘加运算,所以深度可分离卷积的计算量是:
在这里插入图片描述
总的来说:
在这里插入图片描述
可见参数数量和乘加操作的运算量均下降为原来的**加粗样式**
我们通常所使用的是3×3的卷积核,也就是会下降到原来的九分之一到八分之一。

假设
输出为一个224×224×3的图像,VGG网络某层卷积输入的尺寸是112×112×64的特征图,卷积核为3×3×128,标准卷积的运算量是:
3×3×128×64×112×112=924844032
深度可分离卷积的运算量是:
3×3×64×112×112+128×64×112×112 = 109985792
这一层,MobileNetV1所采用的深度可分离卷积计算量与标准卷积计算量的比值为:
109985792 /924844032 = 0.1189
与我们所计算的九分之一到八分之一一致。

V1卷积层
在这里插入图片描述
上图左边是标准卷积层,右边是V1的卷积层,虚线处是不相同点。V1的卷积层,首先使用3×3的深度卷积提取特征,接着是一个BN层,随后是一个ReLU层,在之后就会逐点卷积,最后就是BN和ReLU了。这也很符合深度可分离卷积,将左边的标准卷积拆分成右边的一个深度卷积和一个逐点卷积。

等等,我们发现有什么东西混了进来???ReLU6是什么?

ReLU6
在这里插入图片描述
上图左边是普通的ReLU,对于大于0的值不进行处理,右边是ReLU6,当输入的值大于6的时候,返回6,relu6“具有一个边界”。作者认为ReLU6作为非线性激活函数,在低精度计算下具有更强的鲁棒性。(这里所说的“低精度”,我看到有人说不是指的float16,而是指的定点运算(fixed-point arithmetic))

现在就有一个问题,标准卷积核深度可分离卷积层到底对结果有什么样的影响呢?
上实验。
在这里插入图片描述
可以看到使用深度可分离卷积与标准卷积,参数和计算量能下降为后者的九分之一到八分之一左右。但是准确率只有下降极小的1%。

V1网络结构
在这里插入图片描述
MobileNet的网络结构如上图所示。首先是一个3x3的标准卷积,s2进行下采样。然后就是堆积深度可分离卷积,并且其中的部分深度卷积会利用s2进行下采样。然后采用平均池化层将feature变成1x1,根据预测类别大小加上全连接层,最后是一个softmax层。整个网络有28层,其中深度卷积层有13层。

实验结果
V1论文中还有一部分对V1网络再进行调整,在此就不赘述了,感兴趣的同学可以去看看原论文。
V1的效果到底好不好,作者将V1与大型网络GoogleNet和VGG16进行了比较:
在这里插入图片描述
可以发现,作为轻量级网络的V1在计算量小于GoogleNet,参数量差不多是在一个数量级的基础上,在分类效果上比GoogleNet还要好,这就是要得益于深度可分离卷积了。VGG16的计算量参数量比V1大了30倍,但是结果也仅仅只高了1%不到。

目标检测,在COCO数据集上的结果:
在这里插入图片描述
对了,作者还在论文中分析整个了网络的参数和计算量分布,如下图所示。可以看到整个计算量基本集中在1x1卷积上。对于参数也主要集中在1x1卷积,除此之外还有就是全连接层占了一部分参数。
在这里插入图片描述
代码:
https://github.com/dmlc/gluon-cv/blob/5f5ce87d9a1df1623e15d39d1d2dc65317337652/gluoncv/model_zoo/mobilenet.py#L122

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:设计师小姐姐 返回首页