我見過的所有自動編碼器都具有相同的輸入輸出形狀。但是,我需要一個自動編碼器,其輸入形狀為(None, 32, 16, 3)[RGB 影像],輸出形狀為 [影像(None, 16, 16, 6)的單熱編碼表示]。我嘗試將 Keras 示例用于 mnist 資料集并針對我的用例進行調整,但出現以下錯誤:
ValueError: `logits` and `labels` must have the same shape, received ((None, 32, 16, 6) vs (None, 16, 16, 6)).
下面是我的自動編碼器架構:
input = layers.Input(shape=(32, 16, 3))
# Encoder
x = layers.Conv2D(32, (3, 3), activation="relu", padding="same")(input)
x = layers.MaxPooling2D((2, 2), padding="same")(x)
x = layers.Conv2D(32, (3, 3), activation="relu", padding="same")(x)
x = layers.MaxPooling2D((2, 2), padding="same")(x)
# Decoder
x = layers.Conv2DTranspose(32, (3, 3), strides=2, activation="relu", padding="same")(x)
x = layers.Conv2DTranspose(32, (3, 3), strides=2, activation="relu", padding="same")(x)
x = layers.Conv2D(6, (3, 3), activation="softmax", padding="same")(x)
# Autoencoder
autoencoder = Model(input, x)
autoencoder.compile(opti
mizer="adam", loss="binary_crossentropy")
autoencoder.summary()
我現在關心的是讓它作業而不會導致錯誤,然后我將繼續修復其他東西,比如損失函式等。有沒有辦法讓它作業,或者我應該去其他深度學習架構?
uj5u.com熱心網友回復:
從理論上講,您可以完全按照您的描述構建模型,并最終在輸出上得到與輸入不同的形狀。在這種情況下,您只需要考慮到您的輸入資料也不適合作為訓練的目標。在這種情況下,目標必須是與網路輸出具有相同形狀的資料。
根據錯誤訊息,這里不是這種情況。該模型的輸出形狀為(None, 32, 16, 6)。但是,目標是形狀為 的資料(None, 16, 16, 6)。
為了解決這個問題,必須調整網路或其層,以使兩個形狀相互匹配。通過輸出,autoencoder.summary()您可以很好地看到最后的形狀。例如,具有正確輸出形狀的可能網路如下所示:
input = layers.Input(shape=(32, 16, 3))
# Encoder
x = layers.Conv2D(32, (3, 3),
activation="relu", padding="same")(input)
x = layers.MaxPooling2D((2, 2), padding="same")(x)
x = layers.Conv2D(32, (3, 3), activation="relu", padding="same")(x)
x = layers.MaxPooling2D((4, 2), padding="same")(x)
# Decoder
x = layers.Conv2DTranspose(32, (3, 3), strides=2, activation="relu", padding="same")(x)
x = layers.Conv2DTranspose(32, (3, 3), strides=2, activation="relu", padding="same")(x)
x = layers.Conv2D(6, (3, 3), activation="softmax", padding="same")(x)
# Autoencoder
autoencoder = Model(input, x)
autoencoder.summary()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/466944.html
