卷积神经网络 - 多通道

Convolutional Neural Networks - Multiple Channels

当输入层存在多个通道时,卷积运算是如何进行的? (例如 RGB)

在阅读了 CNN 的 architecture/implementation 之后,我了解到特征图中的每个神经元都引用由内核大小定义的图像的 NxM 像素。然后每个像素由学习到的 NxM 权重集(kernel/filter)的特征图分解,求和,并输入到激活函数中。对于一个简单的灰度图像,我想操作会遵循以下伪代码:

for i in range(0, image_width-kernel_width+1):
    for j in range(0, image_height-kernel_height+1):
        for x in range(0, kernel_width):
            for y in range(0, kernel_height):
                sum += kernel[x,y] * image[i+x,j+y]

        feature_map[i,j] = act_func(sum)
        sum = 0.0

但是我不明白如何扩展这个模型来处理多个渠道。每个特征图是否需要三个独立的权重集,并在每种颜色之间共享?

引用本教程的 'Shared Weights' 部分:http://deeplearning.net/tutorial/lenet.html 特征图中的每个神经元都引用 m-1 层,颜色从不同的神经元引用。我不明白他们在这里表达的关系。神经元是内核还是像素,为什么它们引用图像的不同部分?

根据我的示例,单个神经元内核似乎专用于图像中的特定区域。为什么他们将 RGB 分量拆分到多个区域?

How is the convolution operation carried out when multiple channels are present at the input layer? (e.g. RGB)

在这种情况下,每个输入通道一个 2D 内核(a.k.a 平面)。

因此,您分别执行每个卷积(2D 输入、2D 内核),然后对贡献求和,从而给出最终输出特征图。

请参考本期幻灯片64CVPR 2014 tutorial by Marc'Aurelio Ranzato:

Are three separate weight sets required per feature map, shared between each colour?

如果你考虑一个给定的输出特征图,你有 3 x 2D 内核(即每个输入通道一个内核)。每个 2D 内核在整个输入通道(此处为 R、G 或 B)共享相同的权重。

所以整个卷积层是一个 4D 张量(nb. 输入平面 x nb. 输出平面 x 内核宽度 x 内核高度)。

Why have they split the RGB component over several regions?

如上所述,将每个 R、G 和 B 通道视为具有专用 2D 内核的 独立 输入平面。

Max 没有多大意义,因为通道应该是独立的。从不同通道上的不同过滤器中获取最大结果是将不同方面混合在一起。

为了合并来自不同通道的输出,基本上我们需要一个函数来将输出加在一起。在我看来,这里加法函数的选择可能因用例而异。根据 pytorch conv2d 实现,一种实现只是做一个求和。有关详细信息,请参阅 https://pytorch.org/docs/stable/nn.html

例如,如果您的输入图像的大小为 W x H x C,其中 W、H 和 C 代表宽度、高度的长度和通道的大小。过滤器(也称为内核)的维度为 K x K x C,其中 K 表示内核维度的长度。使用 max 聚合不同渠道的结果无法区分跨渠道的细微差别,这不是我们想要的。如下图(source)所示,输入数据的大小为6 x 6 x 3。单元(过滤器)的数量为2,每个单元的尺寸为3 x 3 x 3。输出是4 x 4 x 2。所以一般来说,通道需要在每个过滤器下单独处理。