问题在于图像的 2D 方面具有局部性。从某种意义上说,附近的事物应该以某种基本方式相关联。例如。头发像素附近的像素预期是头发像素,先验。但是,不同的渠道没有这种关系。当你只有 3 个通道时,一个 3D 卷积相当于在 z 中完全连接。当你有 27 个通道时(例如在网络的中间),为什么任何 3 个通道都被认为彼此“接近”?
This answer 很好地解释了差异。
在频道上建立“完全连接”的关系是what most libraries do by default。请特别注意这一行:“...形状为 [filter_height, filter_width, in_channels, out_channels] 的过滤器/内核张量”。对于大小为 in_channels 的输入向量,大小为 [in_channels, out_channels] 的矩阵是全连接的。因此,可以将过滤器视为图像大小 [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 个频道都是完全任意的,并且它们彼此之间没有内在关系,这表明将它们视为“附近”会有所帮助。
重申一下,在图像中,彼此靠近的像素在某种意义上应该是“相似的”或“相关的”。这就是卷积起作用的原因。如果你把像素弄乱了,然后做了一个卷积,那将一文不值。在那一点上,所有的频道都只是一个混乱。沿通道没有“附近相关性”属性。例如。 “红色”通道不在“绿色”通道或“蓝色”通道附近,因为通道之间的“接近度”没有任何意义。由于“接近度”不是通道维度的属性,因此在该维度上进行卷积可能不会有用。
另一方面,我们可以简单地将所有 in_channels 的输入同时从所有 out_channels 生成输出,并让它们以线性方式相互影响。请注意,所描述的线性变换涉及一种参数的异花授粉。例如,对于网络顶部的层,接收标记为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 + ...
其中大写字母是权重矩阵的条目。
所以您的观察结果是:“严格的 2D CNN 会表现不佳吗?”基于卷积层不包括各个通道之间的任何“混合”的假设。不是这种情况。 in_channels 全部组合在一个线性映射中以获得 out_channels。