卷积的几个基本定义
卷积核大小(Kernel Size): 卷积核的大小定义了卷积的视图范围。二维的常见选择大小是3,即 3×3像素。
卷积核的步长(Stride): Stride 定义了内核的步长。虽然它的默认值通常为 1,但我们可以将步长设置为 2,然后对类似于 MaxPooling 的图像进行向下采样。
边缘填充(Padding): Padding 用于填充输入图像的边界。一个(半)填充的卷积将使空间输出维度与输入相等,而如果卷积核大于 1,则未被填充的卷积将会使一些边界消失。
输入和输出通道: 一个卷积层接受一定数量的输入通道(I),并计算一个特定数量的输出通道(O),这一层所需的参数可以由 I*O*K 计算,K 等于卷积核中值的数量。
卷积网络类型分类
普通卷积
扩张卷积
又名带洞的(atrous)卷积,扩张的卷积引入了另一个被称为扩张率(dilation rate)的卷积层。这定义了卷积核中值之间的间隔。一个 3×3 卷积核的扩张率为 2,它的视图与 5×5 卷积核相同,而只使用 9 个参数。想象一下,取一个 5×5 卷积核,每两行或两列删除一行或一列。
这将以同样的计算代价提供更广阔的视角。扩张的卷积在实时分割领域特别受欢迎。如果需要广泛的视图,并且不能负担多个卷积或更大的卷积核,那么就使用它们。
转置卷积
转置卷积也就是反卷积(deconvolution)。虽然有些人经常直接叫它反卷积,但严格意义上讲是不合适的,因为它不符合一个反卷积的概念。反卷积确实存在,但它们在深度学习领域并不常见。一个实际的反卷积会恢复卷积的过程。想象一下,将一个图像放入一个卷积层中。现在把输出传递到一个黑盒子里,然后你的原始图像会再次出来。这个黑盒子就完成了一个反卷积。这是一个卷积层的数学逆过程。
一个转置的卷积在某种程度上是相似的,因为它产生的相同的空间分辨率是一个假设的反卷积层。然而,在值上执行的实际数学操作是不同的。一个转置的卷积层执行一个常规的卷积,但是它会恢复它的空间变换(spatial transformation)。
5×5 的图像被馈送到一个卷积层。步长设置为 2,无边界填充,而卷积核是 3×3。结果得到了 2×2 的图像。
如果我们想要逆转这个过程,我们需要反向的数学运算,以便从我们输入的每个像素中生成 9 个值。然后,我们将步长设置为 2 来遍历输出图像。这就是一个反卷积过程。
一个转置的卷积并不会这样做。唯一的共同点是,它保证输出将是一个 5×5 的图像,同时仍然执行正常的卷积运算。为了实现这一点,我们需要在输入上执行一些奇特的填充。
正如你现在所能想象的,这一步不会逆转上面的过程。至少不考虑数值。它仅仅是重新构造了之前的空间分辨率并进行了卷积运算。这可能不是数学上的逆过程,但是对于编码-解码器(Encoder-Decoder)架构来说,这仍然是非常有用的。这样我们就可以把图像的尺度上推(upscaling)和卷积结合起来,而不是做两个分离的过程。
如果我们想反转这个过程,我们需要反数学运算,以便从我们输入的每个像素中生成 9 个值。之后,我们以 2 步幅的设置来遍历输出图像。这将是一个反卷积。
可分离卷积
在一个可分离卷积中,我们可以将内核操作拆分成多个步骤。我们用 y = conv(x,k)表示卷积,其中 y 是输出图像,x 是输入图像,k 是内核。这一步很简单。接下来,我们假设 k可以由下面这个等式计算得出:k = k1.dot(k2)。这将使它成为一个可分离的卷积,因为我们可以通过对 k1 和 k2 做 2 个一维卷积来取得相同的结果,而不是用 k 做二维卷积。
我们以通常用于图像处理的 Sobel 内核为例。你可以通过乘以向量[1,0,-1]和[1,2,1].T获得相同的内核。在执行相同的操作时,你只需要 6 个而不是 9 个参数。
上面的示例显示了所谓的空间可分离卷积,据我所知,这并不是在深度学习中使用的。我只是想确保在他人费劲地操作时,你不会受到如此困惑。在神经网络中,我们通常使用的是一种叫做深度可分离卷积的神经网络。