在 Keras 中進(jìn)行模型的評估
在我們進(jìn)行模型訓(xùn)練的過程之中總是避免不了進(jìn)行模型的評估,從而判別一個(gè)模型是好是壞,進(jìn)而幫助我們選擇較好的模型進(jìn)行使用。
那么我們這節(jié)課就來學(xué)習(xí)一下如何進(jìn)行模型的評估。這節(jié)課是在之前的 fashion_mnist 數(shù)據(jù)集合實(shí)驗(yàn)的基礎(chǔ)上進(jìn)行進(jìn)一步的改進(jìn),常用模型的評估方法大致分為兩類:
- 根據(jù)訓(xùn)練過程中的指標(biāo)進(jìn)行評估;
- 訓(xùn)練結(jié)束后在驗(yàn)證集合或者測試集合上進(jìn)行測試。
總體而言,第二種方法是采用較多的方法,因?yàn)槟P?strong>訓(xùn)練的目的不是在已知的數(shù)據(jù)集合上表現(xiàn)良好,而是要在未知的數(shù)據(jù)集合上表現(xiàn)良好。
1. 根據(jù)訓(xùn)練過程中的指標(biāo)進(jìn)行評估
在訓(xùn)練過程中根據(jù)指標(biāo)進(jìn)行評估的時(shí)候大致可以分為兩個(gè)類別:
- 根據(jù)損失函數(shù)進(jìn)行評價(jià);
- 根據(jù)普通的指標(biāo)進(jìn)行評價(jià)。
1· 根據(jù)損失函數(shù)進(jìn)行評價(jià)
根據(jù)損失函數(shù)評價(jià)比較簡單,因?yàn)閾p失函數(shù)是所有的訓(xùn)練過程都需要定義的,而損失函數(shù)也會在訓(xùn)練的過程之中自動(dòng)記錄與保存。
對于所有的損失函數(shù)而言,損失函數(shù)越小,表示我們的模型越精確。我們平常一些常見的損失函數(shù)包括:
- MAE:均絕對誤差,用于回歸任務(wù)學(xué)習(xí)的損失函數(shù);直觀地可以理解為誤差的的均值;
- MSE:均方誤差,用于回歸任務(wù)學(xué)習(xí)的損失函數(shù);與 MAE 相似,直觀地可以理解為誤差的平方的均值;
- Binary_CrossEntropy:二元交叉熵,用于二分類學(xué)習(xí)的損失函數(shù),描述的是標(biāo)簽和預(yù)測值的差距;
- Categorical_CrossEntropy:交叉熵,與二元交叉熵類似,只是用于多分類的任務(wù)的損失函數(shù)。
在使用的時(shí)候要首先在模型編譯的時(shí)候指定損失函數(shù),在后面的訓(xùn)練過程中 TensorFlow 會幫助我們自動(dòng)記錄損失函數(shù)的變化。比如以下的示例:
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy')
在訓(xùn)練的過程之中,我們可以根據(jù)日志的輸出來查看損失函數(shù)的變化:
......
Epoch 2/5
1875/1875 [==============================] - 5s 2ms/step - loss: 0.3616
Epoch 3/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3256
Epoch 4/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3006
......
一般而言損失函數(shù)的值會不斷變小,如果損失函數(shù)變大或者不變,則表示我們的模型出錯(cuò),抑或是獲得的數(shù)據(jù)出錯(cuò)。
2. 根據(jù)普通的指標(biāo)進(jìn)行評價(jià)
如果要使用普通的評價(jià)指標(biāo),比如準(zhǔn)確率,那么我們需要在模型的編譯過程之中使用 metrics 參數(shù)來設(shè)置我們需要追蹤的指標(biāo)。比如如下例子:
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
在上面的代碼之中,我們規(guī)定了準(zhǔn)確率這個(gè)指標(biāo),那么在訓(xùn)練的過程之中 TensorFlow 便會幫助我們評價(jià)該指標(biāo),并將結(jié)果在日志中輸出。比如如下輸出:
Epoch 2/5
1875/1875 [==============================] - 5s 2ms/step - loss: 0.3616 - accuracy: 0.8679
Epoch 3/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3256 - accuracy: 0.8795
Epoch 4/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3006 - accuracy: 0.8883
當(dāng)然我們可以追蹤的指標(biāo)不止準(zhǔn)確率這一個(gè),我們在TensorFlow可以經(jīng)常用到的指標(biāo)主要有:
- Accuracy:準(zhǔn)確率,用于分類任務(wù);
- Mean: 平均值;
- TruePositives:真正例的數(shù)量,用于二分類任務(wù),(真正例:實(shí)際類別和預(yù)測類別都為正,簡寫 TP );
- TrueNegatives:真負(fù)例的數(shù)量,用于二分類任務(wù),(真反例:實(shí)際類別和預(yù)測類別都為負(fù),簡寫 TN )
- FalsePositives:假正例的數(shù)量,用于二分類任務(wù),(假正例:預(yù)測為正,實(shí)際為負(fù),簡寫 FP );
- FalseNegatives:假負(fù)例的數(shù)量,用于二分類任務(wù),(假反例:預(yù)測為負(fù),實(shí)際為正,簡寫 FN );
- Precision:精確率,用于二分類任務(wù),Precision = TP/(TP+FP));
- Recall:召回率,用于二分類任務(wù),Recall = TP/(TP+FN);
- AUC:用于二分類任務(wù)的一個(gè)指標(biāo),可以理解為正樣本的預(yù)測值大于負(fù)樣本的概率;
- MSE:均方誤差,用于回歸任務(wù),可作為損失函數(shù);
- MAE:均絕對誤差,用于回歸任務(wù),可以作為損失函數(shù);
- RMSE:均方根誤差,用于回歸任務(wù),可作為損失函數(shù),由MSE開方即可得到;
2. 在驗(yàn)證集合或者測試集合上進(jìn)行測試
在測試集合上進(jìn)行驗(yàn)證需要我們首先在數(shù)據(jù)集合中預(yù)留出一定的測試集合,一般而言,我們會將所有數(shù)據(jù)的 80% 用于訓(xùn)練集合,而剩下的 20% 用于測試集合。
在測試集合上我們主要是使用 evaluate 方法進(jìn)行模型的評估:
model.evaluate(x_test, y_test)
其中假設(shè)我們的模型已經(jīng)經(jīng)過,而 x_test 與 y_test 分別是測試集合的數(shù)據(jù)和標(biāo)簽。
我們可以得到如下輸出:
313/313 - 0s - loss: 0.3444
0.34437522292137146
如果我們在模型編譯的過程之中添加了指標(biāo),比如準(zhǔn)確率:
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
那么我們會得到輸出:
313/313 - 0s - loss: 0.3836 - accuracy: 0.8792
[0.3835919201374054, 0.8791999816894531]
可以看到,evaluate 方法會記錄損失函數(shù)和編譯中指定的指標(biāo)。而在 evaluate 函數(shù)中返回的指標(biāo)一般可以作為我們參考的較為可靠的依據(jù)。
3. 小結(jié)
在這節(jié)課之中我們學(xué)習(xí)了如何進(jìn)行模型的評估,主要包括如何在訓(xùn)練的過程中進(jìn)行評估以及如何在訓(xùn)練結(jié)束后進(jìn)行評估。