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層應置於最後一層。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章