在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層應置於最後一層。
在修改網絡結構的時候要注意輸出神經元的修改,
從第二層開始,
輸入神經元由機器自動判斷不用自己定義,
但輸出神經元還是要自己判斷。