在機器學習中的整合學習可以在一定程度上提高**精度,常見的整合學習方法有stacking、bagging和boosting,同時這些整合學習方法與具體驗證集劃分聯絡緊密。
由於深度學習模型一般需要較長的訓練週期,如果硬體裝置不允許建議選取留出法,如果需要追求精度可以使用交叉驗證的方法。
下面假設構建了10折交叉驗證,訓練得到10個cnn模型。
那麼在10個cnn模型可以使用如下方式進行整合:
5.3.1 dropout
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
5.3.2 tta測試集資料擴增(test time augmentation,簡稱tta)也是常用的整合學習技巧,資料擴增不僅可以在訓練時候用,而且可以同樣在**時候進行資料擴增,對同乙個樣本**三次,然後對三次結果進行平均。
# 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進行模型整合。
由於在cyclical learning rate中學習率的變化有週期性變大和減少的行為,因此cnn模型很有可能在跳出區域性最優進入另乙個區域性最優。在snapshot**中作者通過使用表明,此種方法可以在一定程度上提高模型精度,但需要更長的訓練時間。
5.4 結果後處理
在不同的任務中可能會有不同的解決方案,不同思路的模型不僅可以互相借鑑,同時也可以修正最終的**結果。
在本次賽題中,可以從以下幾個思路對**結果進行後處理:
為什麼說dropout可以解決過擬合?(1)取平均的作用:
先回到標準的模型即沒有dropout,我們用相同的訓練資料去訓練5個不同的神經網路,一般會得到5個不同的結果,此時我們可以採用
「5個結果取均值」或者「多數取勝的投票策略」去決定最終結果。例如3個網路判斷結果為數字9,那麼很有可能真正的結果就是數字9,其它兩個網路給出了錯誤結果。這種「綜合起來取平均」的策略通常可以有效防止過擬合問題。因為不同的網路可能產生不同的過擬合,取平均則有可能讓一些「相反的」擬合互相抵消。dropout掉不同的隱藏神經元就類似在訓練不同的網路,隨機刪掉一半隱藏神經元導致網路結構已經不同,整個dropout過程就相當於對很多個不同的神經網路取平均。而不同的網路產生不同的過擬合,一些互為「反向」的擬合相互抵消就可以達到整體上減少過擬合。
(2)減少神經元之間複雜的共適應關係:
因為dropout程式導致兩個神經元不一定每次都在乙個dropout網路**現。這樣權值的更新不再依賴於有固定關係的隱含節點的共同作用,阻止了某些特徵僅僅在其它特定特徵下才有效果的情況
。迫使網路去學習更加魯棒的特徵
,這些特徵在其它的神經元的隨機子集中也存在。換句話說假如我們的神經網路是在做出某種**,它不應該對一些特定的線索片段太過敏感,即使丟失特定的線索,它也應該可以從眾多其它線索中學習一些共同的特徵。從這個角度看dropout就有點像l1,l2正則,減少權重使得網路對丟失特定神經元連線的魯棒性提高。
計算機視覺 回歸模型
本文仍然是基於computer vision models,learning,and inference這本書的閱讀筆記與心得。雖然看的雲裡霧裡的,但不寫下來恐怕很快一點都不記得了。看的過程還是很吃力,感覺自己在學機器學習與概率論,在公式中掙扎。本章講的是機器學習兩大問題之一的回歸模型,討論的主要是...
計算機視覺 生成模型
給定訓練集,產生與訓練集同分布的新樣本。希望學到乙個模型,其與訓練樣本的分布相近。無監督學習裡的乙個核心問題 密度估計問題。典型思路 利用鏈式準則將影象x的生成概率轉變為每個畫素生成概率的乘積。缺點是 畫素的生成是序列的進行訓練,生成整張的效率太慢了。二者的優點 似然函式可以精確計算 利用似然函式的...
計算機視覺資料集介紹
1 mnist 美國國家標準與技術研究所,national institute of standards and technology nist 官網位址 資料功能 手寫數字分類 簡要說明 訓練集 training set 由來自 250 個不同人手寫的數字構成,其中 50 是高中學生,50 來自人...