卷积神经网络 - 多通道

时间:2015-01-01 05:37:40

标签: computer-vision artificial-intelligence neural-network convolution

当输入层存在多个通道时,如何执行卷积运算? (例如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 特征图中的每个神经元参考层m-1,颜色从不同的神经元引用。我不明白他们在这里表达的关系。是神经元内核还是像素,为什么它们会引用图像的不同部分?

基于我的例子,似乎单个神经元内核对图像中的特定区域是独占的。为什么他们将RGB组件分成几个区域?

3 个答案:

答案 0 :(得分:32)

  

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

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

所以你分别执行每个卷积(2D输入,2D内核)和你总结贡献,它给出了最终的输出特征图。

请参阅CVPR 2014 tutorialMarc'Aurelio Ranzato幻灯片64:

enter image description here

  

每个要素图是否需要三个单独的权重集,每种颜色之间是否共享?

如果考虑给定的输出要素图,则需要3 x 2D内核(即每个输入通道一个内核)。每个2D内核沿整个输入通道(此处为R,G或B)共享相同的权重。

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

  

为什么他们将RGB组件分成几个区域?

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

答案 1 :(得分:6)

例如,如果您的输入图像的大小为 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。因此通常需要在每个过滤器下单独处理通道。

enter image description here

答案 2 :(得分:0)

Max不太有意义,因为通道应该是独立的。充分利用来自不同通道上不同滤波器的结果,将不同方面混合在一起。

要合并来自不同通道的输出,基本上我们需要一个func来将输出加在一起。我认为,此处的附加功能的选择可能会因使用案例而异。根据pytorch conv2d的实现,一种实现只是进行求和。有关详情,请参见https://pytorch.org/docs/stable/nn.html