[英]Tensorflow Conv2D layers input_shape configuration error: ValueError: Input 0 of layer "sequential" is incompatible with the layer:
[英]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')
])
在許多示例中,不僅在上述示例中,講師並未在其中包含該論點。 有什么理由嗎?
下一層從上一層的 output 派生出所需的形狀。 即MaxPooling2D
層根據Conv2D
層的output等推導出其輸入形狀。 請注意,在您的順序 model 中,您甚至不需要在第一層定義 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))傳遞到 model,則會發生錯誤,因為Conv2D
層需要 3D 輸入(不包括批處理維度)。 如果您的 model 沒有input_shape
,您將無法調用model.summary()
來查看您的網絡。 首先,您必須使用輸入形狀構建 model:
model.build(input_shape=(1, 300, 300, 3))
model.summary()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.