keras 中的内核大小与我指定的不同

Kernel size is different in keras from what I have specified

我一直在使用 Keras 处理卷积神经网络。我使用下图并将其转换为数组。

img_arr = np.array(img)
img_arr = img_arr/255.0

>>>
array([[[0.03137255, 0.0627451 , 0.1372549 ],
        [0.01960784, 0.05098039, 0.1254902 ],
        [0.03921569, 0.07058824, 0.15294118],
        ...,
        [0.01960784, 0.08627451, 0.04705882],
        [0.01568627, 0.06666667, 0.02745098],
        [0.        , 0.05098039, 0.01176471]],

       [[0.35686275, 0.38431373, 0.45490196],
        [0.32941176, 0.35686275, 0.42745098],
        [0.31372549, 0.34117647, 0.41568627],
        ...,

img_arr = np.expand_dims(img_arr, 0)
print(img_arr.shape)

>>> (1, 343, 499, 3)

这就是我预处理图像并从中创建数组的方式。然后我 运行 tf.keras.layers.Conv2D 像这样在这个数组上,

conv1 = tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3))
output_conv1 = conv1(img_arr)
print(output_conv1.shape)

>>> TensorShape([1, 341, 497, 32])

输出形状完全可以理解。但问题是当我在 Keras 中打印 kernel 形状时,

print(conv1.kernel.shape)

>>> TensorShape([3, 3, 3, 32])

我把kernel_size作为(3, 3)传递了,那为什么内核形状中有'3'(3, 3, 3)?最后一个轴是32我想是因为no. of filters。但是第一个 3 轴 (3, 3, 3) 是我不理解的东西!

我相信最后的3是指频道的数量。您正在将 3x3 内核应用于 3 个通道。如果您查看 source code,您将很快了解 kernel_shape 是如何构建的:

kernel_shape = self.kernel_size + (input_channel // self.groups, self.filters)