簡體   English   中英

為什么只為第一個 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')
])

在許多示例中,不僅在上述示例中,講師並未在其中包含該論點。 有什么理由嗎?

下一層從上一層的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM