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)
我一直在使用 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)