目錄
一、理解train和test
train(set):訓練集是用來運行學習算法。
test(set):測試集用來評估算法性能,但不會據此改變學習算法或參數。因此我們可以引入development(set),也叫validation(set),來調整參數,選擇特征,以及對學習算法作出其他決定。本文先忽略驗證集講解。
常規的訓練集和測試集的比例為0.7:0.3,引入驗證集后常采用0.6:0.2:0.2(該方法現在使用較少)。
在保證算法穩定的情況下,訓練集和測試集的選取會對輸出結果的指標造成不同層次的影響(玄學 [手動狗頭])。
二、理解loss和val_loss
loss:訓練集的損失值;val_loss:測試集的損失值。
一般訓練規律:
loss下降,val_loss下降:訓練網絡正常,最理想情況情況。
loss下降,val_loss穩定:網絡過擬合。解決辦法:①數據集沒問題:可以向網絡“中間深度”的位置添加Dropout層;或者逐漸減少網絡的深度(靠經驗刪除一部分模塊)。②數據集有問題:可將所有數據集混洗重新分配,通常開源數據集不容易出現這種情況。
loss穩定,val_loss下降:數據集有嚴重問題,建議重新選擇。一般不會出現這種情況。
loss穩定,val_loss穩定:學習過程遇到瓶頸,需要減小學習率(自適應動量優化器小范圍修改的效果不明顯)或batch數量。
loss上升,val_loss上升:可能是網絡結構設計問題、訓練超參數設置不當、數據集需要清洗等問題。屬於訓練過程中最差情況。
(注意:上面提到的“下降”、“穩定”和“上升”是指整體訓練趨勢。)
第一次補充(個人觀點):
- 損失函數通常是反應網絡在訓練過程的“健康程度”。
- 權重文件的保存通常參考評價函數。
- 上面總結僅是廣義規律,不保證適用於所有網絡。
- 當網絡訓練跑偏了后,先檢查自己寫的網絡是否存在小錯誤。然后檢查數據集是否有問題(如果是開源數據集,可以先分個小樣本訓練來檢測網絡是否設計問題。如果是自定義數據集,可用一些通用網絡(如Unet這種)跑一下來檢測)
