整理学习之深度可分离卷积

一、分组卷积

分组卷积Group convolution是将输入层的不同特征图进行分组,然后采用不同的卷积核再对各个组进行卷积,这样会降低卷积的计算量。

普通卷积:

整理学习之深度可分离卷积_第1张图片

分组卷积

整理学习之深度可分离卷积_第2张图片

将图一卷积的输入feature map分成g组,每个卷积核也相应地分成组,在对应的组内做卷积

图中分组数,即上面的一组feature map只和上面的一组卷积核做卷积,下面的一组feature map只和下面的一组卷积核做卷积。每组卷积都生成一个feature map,共生成2个feature map。


输入feature map尺寸: 分别对应feature map的宽,高,通道数;
单个卷积核尺寸: 分别对应单个卷积核的宽,高,通道数;
输出feature map尺寸 :输出通道数等于卷积核数量,输出的宽和高与卷积步长有关。

整理学习之深度可分离卷积_第3张图片

可以看到,分组卷积可以用同等的参数量运算量生成g个feature map

group conv常用在轻量型高效网络中,因为它用少量的参数量和运算量就能生成大量的feature map,大量的feature map意味着能够编码更多的信息!

从分组卷积的角度来看,分组数g就像一个控制旋钮,最小值是1,此时g=1的卷积就是普通卷积;最大值是输入feature map的通道数C,此时g=C的卷积就是depthwise sepereable convolution,即深度分离卷积,又叫逐通道卷积

整理学习之深度可分离卷积_第4张图片

深度分离卷积是分组卷积的一种特殊形式,其分组数是feature map的通道数。即把每个feature map分为一组,分别在组内做卷积为,组内一个卷积核生成一个feature map。这种卷积形式是最高效的卷积形式,相比普通卷积,用同等的参数量和运算量就能够生成个feature map,而普通卷积只能生成一个feature map。
所以深度分离卷积几乎是构造轻量高效模型的必用结构。

深度可分离卷积

深度可分离卷积 = 深度卷积(Depthwise Convolution) + 逐点卷积(Pointwise Convolution)。

深度可分离卷积将一个核分裂成两个独立的核,分别做两个卷积:深度卷积和点向卷积。

为什么一定要同时考虑图像区域和通道?我们为什么不能把通道和空间区域分开考虑

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

整理学习之深度可分离卷积_第5张图片

常规普通卷积

假设我们有一个12x12x3像素的输入图像,我们对图像做一个5×5的卷积,不加填充,步幅为1。如果我们只考虑图像的宽度和高度,卷积过程是这样的:12×12 – (5×5) – >8×8。我们最终得到一个8×8像素的图像。

由于图像有3个通道,卷积核也需要有3个通道。这意味着,不是做5×5=25次乘法,而是内核每移动一次时做5x5x3=75次乘法。

我们对每25个像素做标量矩阵乘法,输出一个数字。在经过5x5x3内核之后,12x12x3图像将变成8x8x1图像。

整理学习之深度可分离卷积_第6张图片

如果我们想增加输出图像中的通道数量呢?如果我们想要大小为8x8x256的输出呢?

我们可以创建256个内核来创建256个8x8x1图像,然后将它们堆叠在一起,创建出8x8x256图像输出。

整理学习之深度可分离卷积_第7张图片

这就是正常卷积的工作原理。

深度可分离卷积将这个过程分为两部分:深度卷积和点向卷积。

Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法扩展Feature map。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的feature信息。因此需要Pointwise Convolution来将这些Feature map进行组合生成新的Feature map

第1部分-深度卷积:

在第一部分深度卷积中,我们在不改变深度的情况下,对输入图像进行了分组卷积。我们使用3个5x5x1形状的内核。

整理学习之深度可分离卷积_第8张图片

每个5x5x1内核迭代图像的1个通道(注意:1个通道,而不是所有通道),得到每25个像素组的标量积,得到3个8x8x1图像。将这些图像叠加在一起可创建8x8x3图像。

第2部分-点向卷积:

逐点卷积就是1x1的普通卷积。
因为深度卷积没有融合通道间信息,所以需要配合逐点卷积使用。

Pointwise Convolution的运算与常规卷积运算非常相似,它的卷积核的尺寸为 1×1×M,M为上一层的通道数。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个卷积核就有几个输出Feature map

原始卷积将12x12x3图像转换为8x8x256图像。目前,深度卷积已经将12x12x3图像转换为8x8x3图像。现在,我们需要增加每个图像的通道数。

点向卷积之所以如此命名是因为它使用了一个1×1内核,我们通过1x1x3内核迭代8x8x3图像,得到8x8x1图像。

整理学习之深度可分离卷积_第9张图片

我们可以创建256个1x1x3内核,每个内核输出一个8x8x1图像,全部叠加到一起得到形状为8x8x256的最终图像。

整理学习之深度可分离卷积_第10张图片

就这样,我们把卷积分解成2步:深度卷积和点向卷积。

更抽象地说,如果原始卷积函数是12x12x3 – (5x5x3x256)→8x8x256,

我们可以将这个新的卷积表示为12x12x3 – (5x5x1x3) →8x8x3 – > (1x1x3x256) – >8x8x256。

三、深度可分离卷积的优势

我们来计算一下计算机在原始卷积中要做的乘法的个数。有256个5x5x3内核可以移动8×8次。这是256x5x5x3x8x8 = 1228800 次乘法。

可分离卷积呢? 在深度卷积中,我们有3个5x5x1的内核它们移动了8×8次。也就是3x5x5x1x8x8 = 4800。在点向卷积中,我们有256个1x1x3的内核它们移动了8×8次。这是256x1x1x3x8x8 = 49152。把它们加起来,就是53952次乘法。
52,952比1,228,800小很多。计算量越少,网络就能在更短的时间内处理更多的数据。

在普通卷积中,我们对图像进行了256次变换。每个变换都要用到5x5x3x8x8=4800次乘法。在可分离卷积中,我们只对图像做一次变换——在深度卷积中。然后,我们将转换后的图像简单地延长到256通道。不需要一遍又一遍地变换图像,可以节省计算能力。

主要参考:

https://www.jianshu.com/p/a936b7bc54e3

https://blog.csdn.net/zwqjoy/article/details/103384367

你可能感兴趣的:(卷积神经网络)