如何在 CNN 的第一层中对 RGB 图像进行 运行 过滤?

How do filters run across an RGB image, in first layer of a CNN?

我在看这张图层打印输出。 我意识到,这显示了输入/输出,但没有关于如何处理 RGB 通道的信息。

如果您查看 block1_conv1,它会显示“Conv2D”。但是如果输入是 224 x 224 x 3,那么它就不是二维的了。

我的更大、更广泛的问题是,在整个训练过程中如何处理 3 个通道输入,这样的模型(我认为是 VGG16)。 RGB 通道是否在某个点组合(求和或连接)?何时何地?为此需要一些独特的过滤器吗?或者模型 运行 是否从头到尾分别跨越不同的 channel/color 表示?

2D 卷积的“2D”部分不是指卷积输入的维度,也不是滤波器本身的维度,而是指允许滤波器在其中移动的 space (仅限 2 个方向)。另一种思考方式是每个 RGB 通道分别有自己的二维数组过滤器,并在最后添加输出。

does the model run across the different channel/color representations separately from end to end?

实际上,它在每个通道上分别执行此操作。例如,第一个 Conv2D 层分别接收 3 个 224x224 层中的每一层,然后对每个层应用不同的二维数组过滤器。但这并不是所有模型层的端到端,只是在卷积步骤中层内

但是,您可能会问,每个通道有 64 个卷积滤波器,为什么 3 个通道的 Conv2D 输出中没有 3*64 = 192 个通道?这会提示您的问题

Are the RGB channels combined (summed, or concatenated) at some point?

答案是:是的。在将卷积过滤器分别应用到每一层之后,三个通道中的每一个的值都会被添加,然后如果你指定了偏差的话。见下图(来自Dive Into Deep Learning, under CC BY-SA 4.0):

这样做的原因(添加了单独的通道层)是每个通道实际上没有 3 个单独的 2D 阵列过滤器;从技术上讲,只有 1 个 3D 阵列滤波器只能在两个方向上移动。你可以把它想象成一个汉堡包:一个通道(小圆面包)有一个二维阵列滤波器,下一个通道(生菜)有另一个,等等,但所有层都堆叠起来并作为一个整体起作用,所以过滤器权重一次加在一起。不需要为此添加特殊的权重或过滤器,因为在卷积步骤中权重已经存在(这只是将两个拟合参数相乘,也可能是一个)。

二维卷积?

This 是个好资源。

If you look at block1_conv1, it says "Conv2D". But if the input is 224 x 224 x 3, then that's not 2D.

你误解了二维卷积的意思。二维卷积沿着每个通道的高度和宽度在您的输入中移动。它永远不会在第 3 维中移动。因为它在这个平面上移动,所以它是一个二维卷积。实际滤镜是3D的,是的。


但是我们实际上有 3 个图像(红色、绿色和蓝色通道)。它们如何用于生成一维输出?

by the end of the ConvNet architecture we will reduce the full image into a single vector of class scores. Stanford CS231n's website

过滤器的每一层与其各自的输入层卷积的输出是矩阵求和。如果需要,可以向所有元素添加偏差。 。因此,如果您有 3 个输入通道和 1 个滤波器,您将得到 X-Y-1。如果您有 2 个(或 1 个、3 个、4 个或 1000 个)输入通道和 15 个滤波器,您只需得到 X-Y-15。 X 和 Y 是输出高度,这将取决于卷积的其他参数。


3D 卷积

3D 卷积不同,因为每个过滤器都是 3D 的并且在不同的通道中移动,所以每个权重都用于所有通道。


那什么是 1x1 卷积?

这是一种用于降低网络计算成本的技巧,通过减少通道数量(降低输入的维数),而不进行任何 'real' 卷积/计算。这很有用,因为通道越少意味着使用此输出作为输入的计算需要计算的权重越少,例如更大的(3x3 或 5x5)卷积。