我已經實作了一個沒有方形輸入的 CNN 自動編碼器。我有點困惑。是否必須為自動編碼器提供方形輸入?每個 2D 影像的形狀為 800x20。我已經根據形狀輸入了資料。但不知何故,在構建模型時形狀不匹配。我已經分享了模型的代碼和下面的錯誤訊息。需要您的專家建議。謝謝。
x = Input(shape=(800, 20,1))
# Encoder
conv1_1 = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
pool1 = MaxPooling2D((2, 2), padding='same')(conv1_1)
conv1_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool1)
pool2 = MaxPooling2D((2, 2), padding='same')(conv1_2)
conv1_3 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool2)
h = MaxPooling2D((2, 2), padding='same')(conv1_3)
# Decoder
conv2_1 = Conv2D(8, (3, 3), activation='relu', padding='same')(h)
up1 = UpSampling2D((2, 2))(conv2_1)
conv2_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(up1)
up2 = UpSampling2D((2, 2))(conv2_2)
conv2_3 = Conv2D(16, (3, 3), activation='relu', padding='same')(up2)
up3 = UpSampling2D((2, 2))(conv2_3)
r = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up3)
model = Model(inputs=x, outputs=r)
model.compile(optimizer='adadelta', loss='binary_crossentropy', metrics=['accuracy'])
results = model.fit(x_train, x_train, epochs = 500, batch_size=16,validation_data= (x_test, x_test))
這是錯誤:
ValueError: logits and labels must have the same shape ((16, 800, 24, 1) vs (16, 800, 20, 1))
uj5u.com熱心網友回復:
正如錯誤跟蹤所示,您在嘗試使用此自動編碼器時面臨的問題是模型期望輸入形狀為(?, 800, 20, 1),但輸出形狀為(?, 796, 20, 1). 雖然它將每個影像輸入和輸出作為
(800, 20, 1). (檢查模型摘要的輸入和輸出形狀!)
我的推薦——
我已經修復
padding = 'same'并重新調整了形狀,以便輸入張量形狀和輸出相同。查看我修改的內核大小以根據需要獲得輸出形狀。最重要的是,對于堆疊的 conv 編碼器-解碼器架構(例如自動編碼器),建議您將空間資訊轉換為具有后續層的特征圖/過濾器/通道。現在您從 8 個過濾器開始,然后在編碼器中移動到 4 個。應該更像
4->8->16。檢查此圖以參考直覺。

根據上述建議,我在此處進行了更改。
x = Input(shape=(800, 20,1))
# Encoder
conv1_1 = Conv2D(4, (3, 3), activation='relu', padding='same')(x)
pool1 = MaxPooling2D((2, 2), padding='same')(conv1_1)
conv1_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool1)
pool2 = MaxPooling2D((2, 2), padding='same')(conv1_2)
conv1_3 = Conv2D(16, (3, 3), activation='relu', padding='same')(pool2)
h = MaxPooling2D((2, 1), padding='same')(conv1_3) #<------
# # Decoder
conv2_1 = Conv2D(16, (3, 3), activation='relu', padding='same')(h)
up1 = UpSampling2D((2, 2))(conv2_1)
conv2_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(up1)
up2 = UpSampling2D((2, 2))(conv2_2)
conv2_3 = Conv2D(4, (3, 3), activation='sigmoid', padding='same')(up2) #<--- ADD PADDING HERE
up3 = UpSampling2D((2, 1))(conv2_3)
r = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up3)
model = Model(inputs=x, outputs=r)
model.compile(optimizer='adadelta', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()
Model: "model_13"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_16 (InputLayer) [(None, 800, 20, 1)] 0
_________________________________________________________________
conv2d_101 (Conv2D) (None, 800, 20, 4) 40
_________________________________________________________________
max_pooling2d_45 (MaxPooling (None, 400, 10, 4) 0
_________________________________________________________________
conv2d_102 (Conv2D) (None, 400, 10, 8) 296
_________________________________________________________________
max_pooling2d_46 (MaxPooling (None, 200, 5, 8) 0
_________________________________________________________________
conv2d_103 (Conv2D) (None, 200, 5, 16) 1168
_________________________________________________________________
max_pooling2d_47 (MaxPooling (None, 100, 5, 16) 0
_________________________________________________________________
conv2d_104 (Conv2D) (None, 100, 5, 16) 2320
_________________________________________________________________
up_sampling2d_43 (UpSampling (None, 200, 10, 16) 0
_________________________________________________________________
conv2d_105 (Conv2D) (None, 200, 10, 8) 1160
_________________________________________________________________
up_sampling2d_44 (UpSampling (None, 400, 20, 8) 0
_________________________________________________________________
conv2d_106 (Conv2D) (None, 400, 20, 4) 292
_________________________________________________________________
up_sampling2d_45 (UpSampling (None, 800, 20, 4) 0
_________________________________________________________________
conv2d_107 (Conv2D) (None, 800, 20, 1) 37
=================================================================
Total params: 5,313
Trainable params: 5,313
Non-trainable params: 0
_________________________________________________________________
為了顯示模型現在正在運行,讓我創建一個與您正在查看的相同的隨機資料集。
x_train = np.random.random((16,800,20,1))
model.fit(x_train, x_train, epochs=2)
Epoch 1/2
1/1 [==============================] - 0s 180ms/step - loss: 0.7526 - accuracy: 0.0000e 00
Epoch 2/2
1/1 [==============================] - 0s 189ms/step - loss: 0.7526 - accuracy: 0.0000e 00
<tensorflow.python.keras.callbacks.History at 0x7fa85a9896d0>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/318299.html
上一篇:kerasLSTM應該在沒有input_shape引數的情況下作業嗎?
下一篇:如何將sample_weights與3D醫療資料一起使用,而不會有model.fit(x=tf.data.Dataset)導致無法擠壓最后一個暗淡之類的錯誤
