了解 3D 卷积以及何时使用它?

Understanding 3D convolution and when to use it?

我是卷积神经网络新手,正在学习3D卷积。 我能理解的是,2D 卷积为我们提供了 X-Y 维度中低级特征之间的关系,而 3D 卷积有助于检测所有 3 维中的低级特征和它们之间的关系。

考虑使用 2D 转换层来识别手写数字的 CNN。如果一个数字,比如 5,用不同的颜色写成:

严格的 2D CNN 会表现不佳吗(因为它们在 z 维度上属于不同的通道)?

此外,是否有采用 3D 卷积的实用知名神经网络?

问题在于图像的二维方面具有局部性。从某种意义上说,附近的事物应该以某种基本方式相关。例如。头发像素附近的像素被认为是头发像素,这是先验的。但是,不同的渠道没有这种关系。当你只有 3 个通道时,一个 3D 卷积相当于在 z 中完全连接。当你有 27 个频道时(例如在网络中间),为什么任何 3 个频道都被认为是 "close"?

This answer 很好地解释了差异。

通过频道建立 "fully-connected" 关系是 what most libraries do by default。特别注意这一行:“...形状为 [filter_height、filter_width、in_channels、out_channels] 的过滤器/内核张量”。对于大小为 in_channels 的输入向量,大小为 [in_channels、out_channels] 的矩阵是完全连接的。因此,可以将过滤器视为 "patch" 图像大小 [filter_height、filter_width] 上的全连接层。

为了说明,在单个通道上,常规的普通旧图像过滤器获取图像块并将该块映射到新图像中的单个像素。像这样:(image credit)

另一方面,假设我们有多个通道。我们不是执行从 3x3 补丁到 1x1 像素的线性映射,而是执行从 3x3xin_channels 补丁到 1x1xout_channels 像素集的线性映射。我们如何做到这一点?好吧,线性映射只是一个矩阵。请注意,一个 3x3xin_channels 的补丁可以写成具有 3*3*in_channels 个条目的向量。一组 1x1xout_channels 像素可以写成具有 out_channels 个条目的向量。两者之间的线性映射由具有 3*3*in_channels 行和 out_channels 列的矩阵给出。该矩阵的条目是该网络层的参数。该层的工作原理是将输入向量乘以权重矩阵以获得输出向量。这在图像的所有补丁上重复。 (实际上,不是在所有补丁上循环执行此操作,您可以使用 some fanciness 实现等效的事情,这是库在实践中所做的,但它给出相同的结果)

为了说明,映射采用这个 3x3xin_channels 列:

到这个 1x1xout_channels 像素堆栈:

现在,您的建议是用以下位做一些事情:

没有数学上的理由说明为什么您不能使用仅包含整组 in_channels 的 3 个通道的 3x3x3 补丁来做某事。但是,您选择的 3 个频道完全是任意的,它们之间没有内在关系,这表明将它们视为 "nearby" 会有所帮助。

重申一下,在图像中,彼此靠近的像素在某种意义上应该是"similar"或"related"。这就是卷积起作用的原因。如果你把像素打乱然后 然后 做了一个卷积,那将毫无价值。在那张纸条上,所有频道都是一团糟。沿河道没有 "nearby relatedness" 属性。例如。 "red" 频道不靠近 "green" 频道或 "blue" 频道,因为 "nearness" 在频道之间没有任何意义。由于 "nearness" 不是通道维度的 属性,因此在该维度上进行卷积可能不会有用。

另一方面,我们可以简单地把in_channels的ALL的输入同时生成out_channels的ALL的输出,让它们以线性排序相互影响当然。请注意,所描述的线性变换涉及一种参数的交叉授粉。例如,对于网络顶部的一层,采用标记为 r_1_1-r_3_3 等的 3x3 r、g、b 通道块,输出的单个通道中的单个像素从那个补丁看起来像:

A*r_1_1 + B*r_1_2 + ... C*r_3_3 + D*b_1_1 + E*b_1_2 + ... F*b_3_3 + G*g_1_1 + ...

其中大写字母是权重矩阵的条目。

所以您的观察:"Would a strictly 2D CNN would perform poorly?" 是基于这样一个假设,即卷积层在各个通道之间不包含任何 "mixing"。不是这种情况。 in_channels 在线性映射中全部组合以获得 out_channels。