卷积神经网络 - 多通道

30

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

阅读有关CNN架构/实现的相关内容后,我了解到特征映射中的每个神经元都引用由内核大小定义的NxM像素图像。然后,每个像素点都经过特征映射学习的NxM权重集合(即卷积核/滤波器)因子化、相加,并输入激活函数中。对于一个简单的灰度图像,我想这个运算应该遵循以下伪代码:

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

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

参考这个教程的“共享权重”部分:http://deeplearning.net/tutorial/lenet.html 每个特征图中的每个神经元都引用了前一层,颜色是从不同的神经元引用的。我不理解他们在表达什么关系。这些神经元是卷积核还是像素?为什么它们引用图像的不同部分?

根据我的例子,似乎单个神经元内的卷积核专属于图像的特定区域。为什么他们要将RGB组件分割成几个区域?


我投票关闭此问题,因为它属于stats.stackexchange。 - jopasserat
3个回答

48
当输入层存在多个通道时(例如RGB),卷积运算是如何进行的?
在这种情况下,每个输入通道(又称平面)都有一个2D卷积核。
因此,您需要单独执行每个卷积(2D输入,2D卷积核),并将它们的贡献相加,以得到最终的输出特征图。
请参考Marc'Aurelio RanzatoCVPR 2014教程第64页。

enter image description here

如果考虑给定的输出特征图,每个通道都需要三个独立的权重集,共享每个颜色之间的权重。也就是说,对于每个输入通道,有一个2D卷积核,每个2D卷积核沿着整个输入通道(这里是R、G或B)共享相同的权重。因此,整个卷积层是一个四维张量(即输入平面x输出平面x卷积核宽度x卷积核高度)。 他们为什么要将RGB组件分成几个区域? 如上所述,将每个R、G和B通道视为具有其专用2D卷积核的单独输入平面。

2D卷积核不在所有三个通道之间共享?我以为卷积层是一个1 * conv_kernel_num * kernel_width * kernel_height张量。如果卷积核在通道之间不共享,那么我可以将卷积核解释为kernel_width * kernel_height * channel_num(在这种情况下为3)张量吗? - user2696499

13
例如,如果您的输入图像大小为 W x H x C,其中 W、H 和 C 表示宽度、高度和通道大小的长度。滤波器(也称为内核)的维数将是 K x K x C,其中 K 表示内核维度的长度。使用 max 聚合不同通道的结果不能区分通道之间的微妙差异,这不是我们想要的。如下图所示(来源),输入数据大小为 6 x 6 x 3。单元数(过滤器)为 2,每个过滤器的维度为 3 x 3 x 3。输出为 4 x 4 x 2。因此,一般而言,通道需要在每个过滤器下进行单独处理
图片参考:enter image description here

1

“Max”这个词并不太合适,因为通道应该是独立的。在不同通道上使用不同滤波器的结果取最大值会混合不同的方面。

为了将不同通道的输出组合起来,我们基本上需要一个函数将它们相加。在我看来,这里添加函数的选择可以根据用例而异。一种实现方法就是进行求和,这是根据pytorch conv2d实现的。有关详情,请参见https://pytorch.org/docs/stable/nn.html


请在此处添加您链接中的相关部分。 - JJJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接