当输入层存在多个通道时,如何进行卷积运算? (例如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组件分成几个区域?
当输入层存在多个通道时,如何进行卷积运算? (例如RGB)
在这种情况下,每个输入通道(a.k.a平面)有一个2D内核。
因此,您分别执行每个卷积(2D输入,2D内核),并总结给出最终输出要素图的贡献。
请参阅CVPR 2014 tutorial的Marc'Aurelio Ranzato幻灯片64:
每个要素图需要三个单独的权重集,每种颜色之间是否共享?
如果考虑给定的输出特征映射,则需要3个2D内核(即每个输入通道一个内核)。每个2D内核沿整个输入通道(此处为R,G或B)共享相同的权重。
因此整个卷积层是4D张量(nb。输入平面x nb。输出平面x内核宽度x内核高度)。
为什么他们将RGB组件分成几个区域?
如上所述,将每个R,G和B通道视为具有其专用2D内核的单独输入平面。
Max没有多大意义,因为频道应该是独立的。从不同通道上的不同滤波器获取最大结果是将不同方面混合在一起。
对于组合来自不同通道的输出,基本上我们需要一个func来将输出加在一起。在我看来,这里添加功能的选择可能因用例而异。根据pytorch conv2d实现,一种实现只是进行求和。请参阅https://pytorch.org/docs/stable/nn.html了解详情