在上一章我們學習了如何構建驗證集,如何訓練和驗證。本章作為本次賽題學習的最後一章,將會講解如何使用整合學習提高**精度。
本章講解的知識點包括:整合學習方法、深度學習中的整合學習和結果後處理思路。
在機器學習中的整合學習可以在一定程度上提高**精度,常見的整合學習方法有stacking、bagging和boosting,同時這些整合學習方法與具體驗證集劃分聯絡緊密。
由於深度學習模型一般需要較長的訓練週期,如果硬體裝置不允許建議選取留出法,如果需要追求精度可以使用交叉驗證的方法。
下面假設構建了10折交叉驗證,訓練得到10個cnn模型。
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-cmcpfei3-1591108928518)(img/task05/交叉驗證.png)]
那麼在10個cnn模型可以使用如下方式進行整合:
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)defforward
(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)也是常用的整合學習技巧,資料擴增不僅可以在訓練時候用,而且可以同樣在**時候進行資料擴增,對同乙個樣本**三次,然後對三次結果進行平均。12
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)
inenumerate
(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 = 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)]
在不同的任務中可能會有不同的解決方案,不同思路的模型不僅可以互相借鑑,同時也可以修正最終的**結果。
在本次賽題中,可以從以下幾個思路對**結果進行後處理:
在本章中我們講解了深度學習模型做整合學習的各種方法,並以此次賽題為例講解了部分**。以下幾點需要同學們注意:
零基礎入門CV賽事 街景字元編碼識別
pytorch讀取資料 使用定長字元識別思路構建模型 學習python和pytorch中影象讀取 學會擴增方法和pytorch讀取賽題資料 pillow 匯入 from pil import image 讀取 im image.open jpg opencv 匯入 import cv2 讀取 img...
零基礎入門CV賽事 街景字元編碼識別 TASK1
本次新人賽是datawhale與天池聯合發起的零基礎入門系列賽事第二場 零基礎入門cv賽事之街景字元識別 賽題以計算機視覺中字元識別為背景,要求 真實場景下的字元識別,這是乙個典型的字元識別問題 賽題 自google街景影象中的門牌號資料集 the street view house numbers...
零基礎入門CV賽事 街景字元編碼識別 01
賽題 自google街景影象中的門牌號資料集 the street view house numbers dataset,svhn 並根據一定方式取樣得到比賽資料集。任務鏈結 阿里雲天池大賽 零基礎入門cv賽事 街景字元編碼識別。需要注意的是此賽題需要選手識別中所有的字元,為了降低比賽難度,提供了訓...