Sho*_*rma 0 convolution neural-network conv-neural-network
我是卷积神经网络的新手,我正在学习 3D 卷积。我能理解的是,2D 卷积为我们提供了 XY 维度中低级特征之间的关系,而 3D 卷积有助于检测所有 3 维中的低级特征和它们之间的关系。
考虑使用 2D 卷积层来识别手写数字的 CNN。如果一个数字,比如 5,用不同的颜色书写:
严格的 2D CNN 是否会表现不佳(因为它们在 z 维度上属于不同的通道)?
另外,是否有使用 3D 卷积的实用的知名神经网络?
问题在于图像的 2D 方面具有局部性。从某种意义上说,附近的事物应该以某种基本方式相互关联。例如,头发像素附近的像素被预期为先验的头发像素。但是,不同的渠道没有这种关系。当只有 3 个通道时,3D 卷积相当于在 z 中完全连接。当您有 27 个通道时(例如在网络中间),为什么任何 3 个通道都被认为是彼此“接近”的?
这个答案很好地解释了差异。
通过通道建立“完全连接”的关系是大多数图书馆默认所做的。请特别注意这一行:“...形状为 [filter_height, filter_width, in_channels, out_channels] 的过滤器/内核张量”。对于大小为 in_channels 的输入向量,大小为 [in_channels, out_channels] 的矩阵是全连接的。因此,可以将过滤器视为图像大小 [filter_height, filter_width] 的“补丁”上的全连接层。
为了说明,在单个通道上,常规的普通旧图像过滤器获取图像补丁并将该补丁映射到新图像中的单个像素。像这样:(图片来源)
另一方面,假设我们有多个通道。我们不是执行从 3x3 补丁到 1x1 像素的线性映射,而是执行从 3x3xin_channels 补丁到 1x1xout_channels 像素集的线性映射。我们如何做到这一点?好吧,线性映射只是一个矩阵。请注意,3x3xin_channels 补丁可以写为具有 3*3*in_channels 条目的向量。一个 1x1xout_channels 像素集可以写成一个带有 out_channels 条目的向量。两者之间的线性映射由具有 3*3*in_channels 行和 out_channels 列的矩阵给出。该矩阵的条目是网络该层的参数。该层通过简单地将输入向量乘以权重矩阵来获得输出向量。这在图像的所有补丁上重复。(实际上,图书馆在实践中所做的一些幻想,但它给出了相同的结果)
为了说明,映射采用了这个 3x3xin_channels 列:
对于这个 1x1xout_channels 像素堆栈:
现在,您建议使用以下位做一些事情:
没有数学上的原因,为什么您不能对仅包含整个 in_channels 集的 3 个通道的 3x3x3 补丁执行某些操作。但是,您选择的任何 3 个频道都是完全任意的,并且它们彼此之间没有内在关系,这表明将它们视为“附近”会有所帮助。
重申一下,在图像中,彼此靠近的像素在某种意义上应该是“相似的”或“相关的”。这就是卷积起作用的原因。如果你把像素打乱,然后进行卷积,那将毫无价值。在这一点上,所有的频道都是混乱的。有没有沿通道“附近的亲缘关系”属性。例如,“红色”通道不靠近“绿色”通道或“蓝色”通道,因为“接近度”在通道之间没有任何意义。由于“接近度”不是通道维度的属性,因此在该维度上进行卷积可能没有用。
另一方面,我们可以简单地获取所有 in_channels 的输入,同时从所有 out_channels 生成输出,并让它们以线性方式相互影响。请注意,所描述的线性变换涉及一种参数的异花授粉。例如,对于网络顶部的一个层,采用标记为r_1_1-r_3_3等的 r、g、b 通道的 3x3 补丁,该补丁输出的单个通道中的单个像素将如下所示:
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。