通過了數據準備、數據加強、模型構建以及模型驗證和迭代4個階段,基本上獲得了一個還不錯的模型。git
使用改進後的模型獲得測試結果, 去網站提交,結果只有0.625的準確率。發現測試集上的效果和驗證集上的效果差距還挺大的。github
很容易想到的是測試集和驗證集會不會存在分佈上的差別。若是是, 有沒有辦法來解決這種差別。網絡
如今的問題是如何提升網絡的泛化性能。在加了一些tricks以後,訓練集的精度已經能夠達到99%,但驗證集的精度基本上穩定在71%左右,沒法再繼續提高。當模型無法進一步改進時,就應該回到數據自己,能夠檢查一下誤分類的樣本,對其進行一些統計。針對數據進行一些改進。oop
對於常規的圖像分類網絡,輸入的圖像尺寸對於網絡最終的結果不會有太大的影響。而這個任務中,須要同時對圖片中的全部數字進行分類,而且強制網絡的輸出分別去識別對應相應的數字。那麼其實網絡須要去自動的學習,哪一個位置對應哪個字符。所以該分類網絡實際上是有強烈的位置敏感的。性能
爲了嘗試解決這個問題,使用了YOLO V3中的一個trick,每10個epoch,改變一次圖像大小,在這裏,我只改變了圖像的寬度(由於文字主要是橫向分佈的)。從新訓練了resnet18和mobilenet v2。學習
模型集成是一種有效的漲分手段,主要包括bagging、stacking和boosting3類。測試
bagging: 該方法一般考慮的是同質弱學習器,相互獨立地並行學習這些弱學習器,並按照某種肯定性的平均過程將它們組合起來。網站
boosting,該方法一般考慮的也是同質弱學習器。它以一種高度自適應的方法順序地學習這些弱學習器(每一個基礎模型都依賴於前面的模型),並按照某種肯定性的策略將它們組合起來。spa
stacking,該方法一般考慮的是異質弱學習器,並行地學習它們,並經過訓練一個「元模型」將它們組合起來,根據不一樣弱模型的預測結果輸出一個最終的預測結果。blog
Dropout也叫丟棄法,即在訓練過程當中,隨機的丟棄一些神經元,至關於每一次都在train不一樣的模型。它一樣能夠看作是一種集成學習方式。
SnapShot是一種不須要增長額外的訓練成本就能獲取多個網絡模型的方式。它經過保存訓練過程當中,學習率處於最低點位置時的網絡權重,最後會獲得對應不一樣局部極小值的網絡。
snapshot須要結合學習率週期調整策略,下圖爲學習率餘弦衰減策略,snapShot會在每一個學習率調整的週期結束位置,拍快照,也就是保存當前模型權重。
上圖中的學習率的最小值爲5e-4,使用在這樣的極端值(0.1至5e-4,M倍)之間波動的學習速率計劃的背後理論是,訓練模型時存在多個局部極小值。不斷下降學習率會迫使模型停留在低於最佳的局部最小值位置。所以,咱們使用很高的學習率來逃避當前的局部最小值,並嘗試找到另外一個可能更好的局部最小值。
最後對保存的多個模型進行voting或者staking。
TTA(test time augmentation)是一種後處理方式,測試階段,對每張圖片進行數據加強n次,分別獲得n個結果,最後進行vote獲得最終的預測結果。
其思路跟集成學習的思路基本一致,一樣能夠看作是一種集成方法。
最終經過訓練的3個模型進行stacking,達到了0.91的acc。
此次比賽雖然總體難度不大,但想要取得比較好的成績仍是挺難的,能獲得這樣的成績仍是有點意外的。但拋開成績,收穫更多的多是在模型的迭代過程當中,對於調參的一些理解和收穫以及對數據的認識。