可分离卷积

2023.12.11

卷积神经网络中的卷积

卷积神经网络中的卷积一般是用于提取图像中的特征,卷积运算中包括两个矩阵,卷积核和图像。其中,卷积核一般是行列式,它的行和列都是等长的。图像是由一个个像素点组成的,如果我们将图像看做一个矩阵,并且以左上角作为原点建立笛卡尔坐标系,向右和向下分别为 x 轴和 y 轴的正方向,卷积核也是这样。那么对于一个 8×8 的图片,我要用 3×3 的卷积核对其进行卷积运算,先将图片和卷积核的原点对齐,对 3×3 范围内图片中的像素一一与卷积核中的元素进行乘法运算,然后将 9 个元素相加得到最终的结果,最终结果的位置放在卷积核的中心位置。如果步长为 1,也就是我的卷积核每次只移动一个像素,那么卷积核就会计算一次移动一次,从左到右,从上到下,直到卷积核的右下角与图像右下角重合为止。最终运算出来的结果是一个 6×6 的矩阵,它代表了图像的什么特征完全是由卷积核来决定的。

可分离卷积

可分离卷积一般是为了减少卷积操作的乘法次数来减少整个训练过程中的运算量的。一般分为空间可分离卷积和深度可分离卷积

空间可分离卷积

空间可分离卷积只适用于一些特殊的卷积核,比如说用于边缘提取的 3×3 soble 算子,空间可分离卷积是将这个 3×3 的卷积核拆成 3×1×1×3 的两个小卷积核:

[101202101]=[121]×[101]

在拆分之前,我们的卷积核中有 9 个元素,每次卷积运算都要进行 9 次乘法运算。如果拆成两个算子,我们的卷积核总共有 6 个元素,那么两次卷积运算只需要 6 次乘法。未拆分之前,我们对一个 8×8 图像卷积,总共要进行 3×3×6×6=324 次乘法运算;拆分之后,总共要进行 2×3×6×6=216 次乘法运算。

深度可分离卷积

一般我们的图像有 RGB 3 个通道,也就是说我们的矩阵从 2D 转成了 3D,3D 卷积的操作与 2D 类似。通道数也是输入特征的深度。而深度可分离卷积有两个步骤,就是深度卷积与点卷积。

首先,如果一共有 8×8×3 的输入特征,我们用一个 3×3×3 的卷积核对其进行卷积,最终得到的结果是一个 6×6 的特征图。但是我们想输出的特征深度更大,也就是更多的特征,那么我们需要进行多次类似的操作。

而应深度可分离卷积的操作就是,分别用 3 个 3×3 的卷积核对 3 个 8 \times8 的特征图进行卷积操作。在卷积操作之后,将得到的 3 张 6×6 的卷积图进行拼接,得到 6×6×3 的特征并没有得到像 3×3×3 的卷积核那样的输出结果。这个时候我们就要通过点卷积将每层特征结合起来,也就是用 1×1×3 的卷积核对这个 6×6×3 的特征进行卷积操作,最终得到一个 6×6 的输出特征。如果我们想得到更大的深度,只需要在最后的点卷积多进行几次运算后拼接即可。

前面说过,可分离卷积是为了减少乘法操作,那么深度可分离卷积是否减少了乘法操作?这里以输入 8×8×3,卷积核为 3×3×3,输出的特征图是 6×6×3 的话,我们一共需要 3×3×3×6×6×3=2916 次乘法运算,而换成深度可分离卷积就要进行 3×3×6×6×3+3×6×6=1080 次乘法运算。深度卷积运算在深度越大的情况下性能提升更高。

EfficientNet 就是通过将部分卷积运算换成深度可分离的深度卷积运算从而在参数增加的时候比其他模型获得较强的性能提升。