街景字符編碼識別cv入門賽-05模型集成

Datawhale 零基礎入門CV賽事-Task5 模型集成

在上一章我們學習瞭如何構建驗證集,如何訓練和驗證。本章作爲本次賽題學習的最後一章,將會講解如何使用集成學習提高預測精度。

5 模型集成

本章講解的知識點包括:集成學習方法、深度學習中的集成學習和結果後處理思路。

5.1 學習目標

  • 學習集成學習方法以及交叉驗證情況下的模型集成
  • 學會使用深度學習模型的集成學習

5.2 集成學習方法

在機器學習中的集成學習可以在一定程度上提高預測精度,常見的集成學習方法有Stacking、Bagging和Boosting,同時這些集成學習方法與具體驗證集劃分聯繫緊密。

由於深度學習模型一般需要較長的訓練週期,如果硬件設備不允許建議選取留出法,如果需要追求精度可以使用交叉驗證的方法。

下面假設構建了10折交叉驗證,訓練得到10個CNN模型。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CmCpfEi3-1591108928518)(IMG/Task05/交叉驗證.png)]

那麼在10個CNN模型可以使用如下方式進行集成:

  • 對預測的結果的概率值進行平均,然後解碼爲具體字符;
  • 對預測的字符進行投票,得到最終字符。

5.3 深度學習中的集成學習

此外在深度學習中本身還有一些集成學習思路的做法,值得借鑑學習:

5.3.1 Dropout

Dropout可以作爲訓練深度神經網絡的一種技巧。在每個訓練批次中,通過隨機讓一部分的節點停止工作。同時在預測的過程中讓所有的節點都其作用。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KhHGSCPG-1591108928527)(IMG/Task05/Droopout.png)]

Dropout經常出現在在先有的CNN網絡中,可以有效的緩解模型過擬合的情況,也可以在預測時增加模型的精度。

加入Dropout後的網絡結構如下:

# 定義模型
class SVHN_Model1(nn.Module):
    def __init__(self):
        super(SVHN_Model1, self).__init__()
        # CNN提取特徵模塊
        self.cnn = nn.Sequential(
            nn.Conv2d(3, 16, kernel_size=(3, 3), stride=(2, 2)),
            nn.ReLU(),
            nn.Dropout(0.25),
            nn.MaxPool2d(2),
            nn.Conv2d(16, 32, kernel_size=(3, 3), stride=(2, 2)),
            nn.ReLU(), 
            nn.Dropout(0.25),
            nn.MaxPool2d(2),
        )
        # 
        self.fc1 = nn.Linear(32*3*7, 11)
        self.fc2 = nn.Linear(32*3*7, 11)
        self.fc3 = nn.Linear(32*3*7, 11)
        self.fc4 = nn.Linear(32*3*7, 11)
        self.fc5 = nn.Linear(32*3*7, 11)
        self.fc6 = nn.Linear(32*3*7, 11)
    
    def forward(self, img):        
        feat = self.cnn(img)
        feat = feat.view(feat.shape[0], -1)
        c1 = self.fc1(feat)
        c2 = self.fc2(feat)
        c3 = self.fc3(feat)
        c4 = self.fc4(feat)
        c5 = self.fc5(feat)
        c6 = self.fc6(feat)
        return c1, c2, c3, c4, c5, c6

5.3.2 TTA

測試集數據擴增(Test Time Augmentation,簡稱TTA)也是常用的集成學習技巧,數據擴增不僅可以在訓練時候用,而且可以同樣在預測時候進行數據擴增,對同一個樣本預測三次,然後對三次結果進行平均。

1 2 3
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hGiy9kzP-1591108928530)(IMG/Task02/23.png)] [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zqWHf8Pk-1591108928538)(IMG/Task02/23_1.png)] [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3OKuHSoT-1591108928544)(IMG/Task02/23_2.png)]
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

5.3.3 Snapshot

本章的開頭已經提到,假設我們訓練了10個CNN則可以將多個模型的預測結果進行平均。但是加入只訓練了一個CNN模型,如何做模型集成呢?

在論文Snapshot Ensembles中,作者提出使用cyclical learning rate進行訓練模型,並保存精度比較好的一些checkopint,最後將多個checkpoint進行模型集成。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-41LgksRF-1591108928547)(IMG/Task05/Snapshot.png)]

由於在cyclical learning rate中學習率的變化有週期性變大和減少的行爲,因此CNN模型很有可能在跳出局部最優進入另一個局部最優。在Snapshot論文中作者通過使用表明,此種方法可以在一定程度上提高模型精度,但需要更長的訓練時間。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qDYJOABC-1591108928549)(IMG/Task05/對比.png)]

5.4 結果後處理

在不同的任務中可能會有不同的解決方案,不同思路的模型不僅可以互相借鑑,同時也可以修正最終的預測結果。

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

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

5.5 本章小節

在本章中我們講解了深度學習模型做集成學習的各種方法,並以此次賽題爲例講解了部分代碼。以下幾點需要同學們注意:

  • 集成學習只能在一定程度上提高精度,並需要耗費較大的訓練時間,因此建議先使用提高單個模型的精度,再考慮集成學習過程;
  • 具體的集成學習方法需要與驗證集劃分方法結合,Dropout和TTA在所有場景有可以起作用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章