tensorflow2.0-ValueError:A target array with shape was passed for an output of shape...問題解決


在Jupyter notebook訓練一個多分類模型時遇到報錯

問題:
喂入的是fashion_mnist數據集,訓練和測試的圖片都經過了歸一化,標簽也都轉為獨熱編碼

模型建立的代碼如下:

model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape = (28, 28)))
model.add(tf.keras.layers.Dense(128, activation = 'relu'))
model.add(tf.keras.layers.Dense(10, activation = 'softmax'))

之前運行的時候是沒有報錯的,
后來我打算添加層,試一下網絡擬合能力有沒有提升,
於是在上面的代碼下面簡單粗暴地加了一行:

model.add(tf.keras.layers.Dense(128, activation = 'relu'))

之后進行模型裝配,指定損失函數為分類交叉熵

model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate = 0.01),
              loss = 'categorical_crossentropy',
              metrics = ['acc'])

傳入數據進行訓練的時候就遇到報錯:

model.fit(train_image, train_label_onehot, epochs = 5)

報錯如下:

...
ValueError: A target array with shape (60000, 10) was passed for an output of shape (None, 128)
while using as loss `categorical_crossentropy`. 
This loss expects targets to have the same shape as the output.

原因:
添加網絡層的時候沒有修改輸出神經元的個數。
將標簽轉為獨熱編碼之后label.shape由(60000, )變為(60000, 10)
因此對應的輸出的應該是10個神經元

解決:
128 改為10

model.add(tf.keras.layers.Dense(10, activation = 'relu'))

總結:
其實不應該這么直接修改網絡層,
softmax層應置於最后一層。

在修改網絡結構的時候要注意輸出神經元的修改,
從第二層開始,
輸入神經元由機器自動判斷不用自己定義,
但輸出神經元還是要自己判斷。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM