簡體   English   中英

使用二進制交叉熵時輸入和輸出形狀不匹配 Keras TF自動編碼器

[英]Input and Output shape mismatched when using binary cross entropy | Keras tf autoencoder

我正在構建一個采用16x16展平圖像的自動編碼器,並且不斷出現以下錯誤:

ValueError: A target array with shape (999, 16, 16, 256) was passed for an output of shape (None, 256) while using as loss `binary_crossentropy`. This loss expects targets to have the same shape as the output.

我的嘗試:我以為我必須在topk層之后重塑解碼器內部的張量,但它無法解決錯誤,只是輸出了更多錯誤。 我在下面注釋了我的嘗試。 我相信我需要進行某種類型的重塑,以便輸入形狀和輸出形狀彼此匹配,以便二進制交叉熵損失可以起作用。

這是我的代碼的最小工作示例:

encoding_dim = 16
input_img = tf.keras.layers.Input(shape=(16, 16, 256), name ="input")
# flatten your images
flatten = tf.keras.layers.Flatten()(input_img)
encoded = tf.keras.layers.Dense(encoding_dim, activation='relu')(flatten)
encoded2 = tf.keras.layers.Dense(256, activation='sigmoid')(encoded)
# top_k layer
topk = tf.keras.layers.Lambda(lambda x: tf.nn.top_k(x, k=int(int(x.shape[-1])/2),
                                                sorted=True,
                                                name="topk").values)(encoded)
decoded = tf.keras.layers.Dense(128, activation='relu')(topk) 
decoded2 = tf.keras.layers.Dense(256, activation='sigmoid')(decoded)
#decoded3 = tf.keras.layers.Reshape((16,16,256))(decoded2)
autoencoder = tf.keras.Model(input_img, decoded2)
autoencoder.compile(optimizer = 'adadelta', 
                    loss='binary_crossentropy')
autoencoder.fit(x_train, x_train,
            epochs=100,
            batch_size=256,
            shuffle=False,
            validation_data=(x_test, x_test))

當前,您的輸入形狀為(batch, 16, 16, 256)

如果要指定batch256明確你應該使用batch_shape的說法,而不是shape你的內部Input層。 但是,您不應該這樣做,因為最好是保持靈活性,以防您要更改它(或者批量大小通常不相等)。

您的輸出必須具有相同的形狀,因此在最后一個輸出節點上應為keras.layers.Dense(16 * 16, activation="sigmoid")keras.layers.Reshape((16, 16)) 請注意,您沒有在任何地方指定批處理,僅在其余維度上指定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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