如果您将精确的输入形状传递给网络上的第一层或输入层,您将获得所需的输出。例如,我在这里使用了输入层:
input_1 (InputLayer) [(None, 224, 224, 3)] 0
_________________________________________________________________
block1_conv1 (Conv2D) (None, 224, 224, 64) 1792
_________________________________________________________________
block1_conv2 (Conv2D) (None, 224, 224, 64) 36928
将输入作为 (224,224,3) 传递。3 代表这里的深度。请注意,卷积参数的计算不同于密集层的计算。
如果您执行以下操作:
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3))
你会看见:
conv2d (Conv2D) ---> (None, 148, 148, 16)
默认情况下,尺寸减小到 148x148,在 Keras 中填充valid
。也是strides
1。那么输出的形状将是148 x 148。(您可以搜索公式。)
那么什么是None值?
- 第一个None值是批量大小。在 Keras 中,第一个维度是批量大小。您可以传递它们并进行修复,或者您可以在拟合模型或预测时确定它们。
- 在 2D 卷积中,预期的输入是(batch_size, height, width, channels),您还可以具有(None, None, None, 3)等形状,这意味着允许不同的图像大小。
编辑:
tf.keras.layers.Input(shape = (None, None, 3)),
tf.keras.layers.Conv2D(16, (3,3), activation='relu')
产生:
conv2d_21 (Conv2D) (None, None, None, 16) 448
关于您的问题,即使我们将图像高度和宽度传递为None,如何计算参数?
卷积参数计算依据:
(filter_height * filter_width * input_image_channels + 1) * number_of_filters
当我们将它们放入公式中时,
filter_height = 3
filter_width = 3
input_image_channel = 3
number_of_filters = 16
参数 = (3 x 3 x 3 + 1) * 16 = 28 * 16 = 448
注意,我们只需要 input_image 的通道号为 3,表示它是 RGB 图像。
如果要计算后面卷积的参数,则需要考虑上一层的过滤器数量变成当前层通道的通道数。
这就是你最终可以拥有None参数而不是 batch_size 的方式。在这种情况下,Keras 需要知道您的图像是否为 RGB。或者您在创建模型时不会指定维度,并且可以在将模型与数据集拟合时传递它们。