街景字符編碼識別之模型集成

點贊再看,養成習慣!覺得不過癮的童鞋,歡迎關注公衆號《機器學習算法工程師》,有非常多大神的乾貨文章可供學習噢…

前言

模型集成,一般會在比賽後期用到,各種堆特徵、模型等,一般對精度地提升不會太大(+2%左右),所以小編不是特別想深入下去,不過像XGBoost這樣地有理論支撐的集成模型值得深究,有機會單獨寫一篇文章。DW組織給的學習資料主要包括三方面的內容:集成學習方法、深度學習中的集成學習和結果後處理思路。

正文

集成學習方法

常見的集成學習方法有Stacking、Bagging和Boosting。像著名的XGBoost就使用上了Bagging和Boosting策略。一般比較簡單也比較直觀的集成學習方法,就是Bagging了,比如對於迴歸問題,訓練出的多個模型預測的結果採用平均法,得到最終的結果;對於分類問題,則是採用投票法。

深度學習中的集成學習

小編比較熟悉的是丟棄法(Dropout)與測試集數據擴增(Test Time Augmentation,簡稱TTA),像Snapshot並沒有用過。

  1. Dropout
    原本是用來防止DL模型過擬合的Trick。更詳細的資料見參考文獻處。
  2. TTA
    數據擴增不僅可以在訓練時候用,而且可以同樣在預測時候進行數據擴增,對同一個樣本預測多次,然後對這些結果進行平均。
def predict(test_loader, model, tta=10):
   model.eval()
   test_pred_tta = None
   # TTA 次數
   for _ in range(tta):
       test_pred = []
   
       with torch.no_grad():
           for i, (input, target) in enumerate(test_loader):
               c0, c1, c2, c3, c4, c5 = model(data[0])
               output = np.concatenate([c0.data.numpy(), c1.data.numpy(),
                  c2.data.numpy(), c3.data.numpy(),
                  c4.data.numpy(), c5.data.numpy()], axis=1)
               test_pred.append(output)
       
       test_pred = np.vstack(test_pred)
       if test_pred_tta is None:
           test_pred_tta = test_pred
       else:
           test_pred_tta += test_pred
   
   return test_pred_tta

很明顯這份代碼關鍵步驟在於test_loader裏是如何用上transforms的,當然由於模型集成還沒有納入小編的考慮範圍,所以這份代碼暫時還沒有加入到github的項目中。

結果後處理

在本次賽題中,可以從以下幾個思路對預測結果進行後處理:

  1. 統計圖片中每個位置字符出現的頻率,使用規則修正結果;
  2. 單獨訓練一個字符長度預測模型,用來預測圖片中字符個數,並修正結果。

這些後處理的思路都非常有意思,原因在於不同場景的問題會採用的思路都不同,比如小編曾經見過一個做圖像分割的任務用過的後處理思路便是把框出來的實例內部點統一類別,這看上去非常合理。所以後處理思路大多取決於對場景的理解以及對數據分析的程度。

結語

模型集成終究是個耗時耗力的Trick,尤其在使用上深度學習,集成多個模型並不符合一些實時需求,在比賽上可以玩玩。

參考文獻

  1. DW學習資料
  2. Dropout: https://blog.csdn.net/gongsai20141004277/article/details/104359464

童鞋們,讓小編聽見你們的聲音,點贊評論,一起加油。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章