小白求問,我在運用vgg19進行3classes圖像分類,經過了10epochs後valaccuracy保持在了80%左右,但是train_accuracy一直在上升,請問是什麼原因導致的,是不是overfitting呢?


對於神經網路訓練中,準確率不足的問題,系統整理一下:

第一部分,我們手裡的鎚子

  1. 搜集更多的數據:萬能方法,但往往成本很高。data augmentation 是一種妥協方法

2. 更多的數據,並且讓訓練集盡量多種多樣:同上,萬能方法,成本很高

3. 更久的訓練

4. 使用其它優化方法,而不是梯度下降,例如Adam

5. 試試更大的網路

6. 試試更小的網路

7. dropout

8. 正則化

9. 改變網路結構:激活函數,隱含層數量等

10. ........

第二部分,我們眼前的釘子

如何提高訓練集上的表現?

  1. 更大的網路
  2. 使用其它優化演算法,例如Adam

如何提高 validation set 上的表現?

  1. 正則化
  2. 擴大訓練集

如何提高在 test set 上的表現?

更大的validation set

如何提高真實世界上的表現?

改變 validation set/test set 或者 cost function

另外還有一些手段,例如 early stopping,它同時降低訓練集上的精度和提高泛化能力。

一個行為同時顯著影響兩項得分,使我們在真實工程中非常困擾,能不用就不用。(這裡引用吳恩達的一個比喻。如果一輛車有兩套控制系統,分別控制左右、前後,這輛車就容易開。如果一輛車的控制系統是 0.7左右+0.3前後,以及0.5左右+0.5前後,理論上這車也能開,但很難很難)

另外還有一個比較笨,但非常有效的辦法。把 validation set 中錯誤的那部分列出來單獨分析,如果它們是很相似的一類,那你就要開心了。這種情況下,考慮如下處理:

  1. 數據或者模型需要改進。例如:
    1. 一個圖像識別演算法,發現識別錯誤的基本都是老虎(識別成貓),那麼可能是數據本身不足以支持這樣的識別,或者模型過於簡單/超參數有誤。
    2. 一個房價預測模型,發現測試集中很多200平以上房價預測錯誤,而訓練集上,200平以上樣本只有2條
    3. 還是一個房價預測模型,發現測試集錯誤的,集中在某個小區。
  2. 如果怎樣都不行的話,考慮外加規則。看起來比較醜陋,但生產環境往往需要藉助這種方法。


如果只是10個epoch,可以嘗試讓它繼續跑一會,如果還是不行的話簡單說一些可以嘗試的辦法吧:

首先看數據有沒有預處理,減去均值除以方差

再看看數據有沒有增強,比如說隨機裁剪,水平翻轉,亮度飽和度對比度改變

網路最後fc層可以加dropout減輕過擬合

可以加正則項

模型參數的初始化,BN+ReLU的話用Xavier

嘗試用label smothing

學習率調整,可以看著loss大概在多少epoch後不太降了就進行學習率衰減,或者可以嘗試餘弦退火

如果是用自己的數據集,看看能否收集到更多的訓練數據


訓練的metrics還在提高但是validation的metrics沒有提高了,可以考慮是出現overfit。不過也跟你的學習策略相關,即你所選擇的optimizor和學習率lr,有時候梯度下降卡在了一個local optimization的位置也可能會出現這種情況。可以使用自適應的學習策略還有改變你的學習率lr都可能幫助你的validation metrics進一步提升。

然後你說的提升模型的方法有很多可以考慮:

1)數據層面解決類間不平衡的問題,以及一個類內正負樣本的不平衡問題。即想辦法擴充數據,或者在訓練時給不同部分的數據加上訓練的權重;

2)模型層面我記得VGG19算是比較老一些的模型了,如果自己設計模型的話可以考慮參考ResNet的設計,加入一些Node的跳躍連接製造殘差,這樣可以加深網路的結構不容易出現過擬合,也不容易出現梯度爆炸和消失。


換一個思路,不要盲目的調

請思考下列問題

請問驗證集中經常分類錯誤的圖有哪些?

這類圖片有什麼特點?

是數據本身標註問題嘛?

是人也很難區分嘛?

開始訓練的時候做過數據分析嘛?

數據類別數量平衡嗎?

數據乾淨嗎?

深度學習除了用各種技巧刷精度外,也要理解現在的模型的能力,可以從可視化的角度進行分析,如果發現分類錯誤的這些圖片有共性,那麼就可以對症下藥了


是,不過你可以再訓訓,待train_acc到1了val可能會上升。我之前在pytorch forums上有個大佬回答我的是改進一下數據增強。當然也可以嘗試看下你樣本的分布,是不是有那麼一點不均衡,然後重寫一下sampler。不知道你是什麼任務,可不可以加多任務的loss或者用一些類內類間loss來讓訓練難度加大。(我是菜 ,所以一下就只想到這些,等大佬們來回答吧


推薦閱讀:
相关文章