零基礎入門CV賽事 Task5 模型整合

2021-10-06 17:49:22 字數 3299 閱讀 7863

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

stacking先從初始資料集訓練出初級學習器(個體學習器),然後「生成」乙個新資料集用於訓練次級學習器(用於結合的學習器,也稱元學習器meta-learner)。新的資料集中,初級學習器的輸出被當作樣例輸入特徵。

注:訓練階段,次級訓練集是通過初級學習器產生的,若直接使用初級學習器的訓練集來產生次級訓練集,則過擬合風險會比較大;因此,一般是通過使用交叉驗證這樣的方式。

也稱自舉匯聚法(bootstrap aggregating),是在原始資料集選擇t次後得到t個新資料集。通過放回取樣得到(比如要得到乙個大小為n的新資料集,該資料集中的每個樣本都是在原始資料集中隨機取樣,即抽樣之後又放回)得到。基於每個取樣集訓練出乙個基學習器,再將這些基學習器結合,在對**輸出進行結合時,bagging通常對分類任務使用簡單投票法,對回歸任務採用簡單平均法。bagging主要關注降低方差。

為啥有放回取樣?:訓練資料不同,我們獲得的基學習器可望具有比較大的差異。然而,如果取樣出的子集都完全不同,則每個基學習器只用到了一小部分訓練資料,甚至不足以進行有效學習,顯然無法產生比較好的基學習器。所以,採取相互有交疊的取樣子集。

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

測試集資料擴增(test time augmentation,簡稱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)

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

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

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

統計中每個位置字元出現的頻率,使用規則修正結果;

單獨訓練乙個字元長度**模型,用來**中字元個數,並修正結果。

零基礎入門CV賽事 Task5 模型整合

學習整合學習方法以及交叉驗證情況下的模型整合 學會使用深度學習模型的整合學習 目的是提高 精度 方法有 stacking bagging boosting等,例如在機器學習中,對10個cnn模型可以使用如下方式進行整合 對 的結果的概率值進行平均,然後解碼為具體字元 對 的字元進行投票,得到最終字元...

零基礎入門CV賽事 Task5 模型整合

k means通常被稱為勞埃德演算法,這在資料聚類中是最經典的,也是相對容易理解的模型。演算法執行的過程分為4個階段。1.首先,隨機設k個特徵空間內的點作為初始的聚類中心。2.然後,對於根據每個資料的特徵向量,從k個聚類中心中尋找距離最近的乙個,並且把該資料標記為這個聚類中心。3.接著,在所有的資料...

Datawhale 零基礎入門CV賽事

本章將會講解卷積神經網路 convolutional neural network,cnn 的常見層,並從頭搭建乙個字元識別模型。學習cnn基礎和原理 使用pytorch框架構建cnn模型,並完成訓練 卷積神經網路 簡稱cnn 是一類特殊的人工神經網路,是深度學習中重要的乙個分支。cnn在很多領域都...