本章講解的知識點包括:整合學習方法、深度學習中的整合學習和結果後處理思路。
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在很多領域都...