零基礎入門CV Task 05 模型整合

2021-10-06 18:20:41 字數 3809 閱讀 4549

在上一章我們學習了如何構建驗證集,如何訓練和驗證。本章作為本次賽題學習的最後一章,將會講解如何使用整合學習提高**精度。

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

在機器學習中的整合學習可以在一定程度上提高**精度,常見的整合學習方法有stacking、bagging和boosting,同時這些整合學習方法與具體驗證集劃分聯絡緊密。

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

下面假設構建了10折交叉驗證,訓練得到10個cnn模型。

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-omiwczos-1591092253771)(img/task05/交叉驗證.png)]

那麼在10個cnn模型可以使用如下方式進行整合:

5.3.1 dropout

dropout可以作為訓練深度神經網路的一種技巧。在每個訓練批次中,通過隨機讓一部分的節點停止工作。同時在**的過程中讓所有的節點都其作用。

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-slqd4zb6-1591092253772)(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-udvutpjd-1591092253774)(img/task02/23.png)]

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-2sbzcamj-1591092253776)(img/task02/23_1.png)]

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-g2oux0hm-1591092253777)(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-2ugdfi0p-1591092253778)(img/task05/snapshot.png)]

由於在cyclical learning rate中學習率的變化有週期性變大和減少的行為,因此cnn模型很有可能在跳出區域性最優進入另乙個區域性最優。在snapshot**中作者通過使用表明,此種方法可以在一定程度上提高模型精度,但需要更長的訓練時間。

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-yriy1gyv-1591092253779)(img/task05/對比.png)]

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

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

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

Git入門 零基礎入門

git 一 在linux上的安裝 yum install giit 二 linux環境下檢出專案到本地 git clone 三 第一次提交 1.新建乙個檔案 用於後期的提交 vi 日記 2.git status檢視當前工作區檔案。提示有尚未跟蹤的檔案 3.git add 日記 rm和add相反,從工...

Python零基礎入門

python零基礎入門 第一周前言 最近在簡單學習python,在之前的學習中也只對c語言有了乙個粗略的了解,可以說在程式設計方面沒有什麼基礎,當然這也是我第一次寫部落格,希望自己越學越好,希望自己加油 在這一周中,還是學習到了不少的東西,也希望把自己學到的東西寫下來,來加強對python的學習,若...

HTML零基礎入門

注意事項 1.doctype html 必須放在文件的第一行。2.doctype 宣告不是html標籤。當出現中文亂碼時,使用標籤來解決。3.影象標籤中 img src alt src必寫,它是屬於單閉合開關。標題標籤 h1 h6 段落標籤 p 換行標籤 br 單閉合開關 水平線標籤 hr 水平分割...