为什么只为第一个 Conv2D 层指定 Conv2D 层的 input_shape 属性?
Why should the input_shape property of a Conv2D layer be specified only for the first Conv2D layer?
我是 AI/ML 的新手。我正在学习 TensorFlow。在某些教程中,我注意到 Conv2D
层的 input_shape
参数仅针对第一层指定。代码看起来有点像这样:
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu',
input_shape=(300,300,3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
在很多例子中,不仅在上面,讲师没有在其中包含该论点。有什么原因吗?
下一层从上一层的输出中导出所需的形状。也就是说,MaxPooling2D
层根据 Conv2D
层的输出导出其输入形状,依此类推。请注意,在您的顺序模型中,您甚至不需要在第一层定义 input_shape 。如果您向它提供真实数据,它能够导出 input_shape
,这为您提供了更多的灵活性,因为您不必对输入形状进行硬编码:
import tensorflow as tf
tf.random.set_seed(1)
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu',),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
print(model(tf.random.normal((1, 300, 300, 3))))
tf.Tensor([[0.6059081]], shape=(1, 1), dtype=float32)
如果将形状不正确的数据(例如 (300, 3) 而不是 (300, 300, 3))传递给您的模型,则会发生错误,因为 Conv2D
图层需要 3D 输入不包括批次维度。
但是,如果您的模型没有 input_shape
,您将无法调用 model.summary()
查看您的网络。首先,您必须使用输入形状构建模型:
model.build(input_shape=(1, 300, 300, 3))
model.summary()
我是 AI/ML 的新手。我正在学习 TensorFlow。在某些教程中,我注意到 Conv2D
层的 input_shape
参数仅针对第一层指定。代码看起来有点像这样:
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu',
input_shape=(300,300,3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
在很多例子中,不仅在上面,讲师没有在其中包含该论点。有什么原因吗?
下一层从上一层的输出中导出所需的形状。也就是说,MaxPooling2D
层根据 Conv2D
层的输出导出其输入形状,依此类推。请注意,在您的顺序模型中,您甚至不需要在第一层定义 input_shape 。如果您向它提供真实数据,它能够导出 input_shape
,这为您提供了更多的灵活性,因为您不必对输入形状进行硬编码:
import tensorflow as tf
tf.random.set_seed(1)
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu',),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
print(model(tf.random.normal((1, 300, 300, 3))))
tf.Tensor([[0.6059081]], shape=(1, 1), dtype=float32)
如果将形状不正确的数据(例如 (300, 3) 而不是 (300, 300, 3))传递给您的模型,则会发生错误,因为 Conv2D
图层需要 3D 输入不包括批次维度。
但是,如果您的模型没有 input_shape
,您将无法调用 model.summary()
查看您的网络。首先,您必须使用输入形状构建模型:
model.build(input_shape=(1, 300, 300, 3))
model.summary()