【譯】如何應(yīng)對(duì) CNN 中的過(guò)擬合問(wèn)題

個(gè)人主頁(yè):http://hellogod.cn

什么是卷積、最大池化和 Dropout?

這篇文章是深度學(xué)習(xí)系列中一篇文章。請(qǐng)查看#系列1#系列2

數(shù)據(jù)增強(qiáng)(Data augmentation)

歡迎來(lái)到本系列教程的第三部分的學(xué)習(xí)!這周我會(huì)講解一些卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)的內(nèi)容并且討論如何解決欠擬合過(guò)擬合。

一、卷積(Convolution)

那么究竟什么是卷積呢?你可能還記得我之前的博客,我們使用了一個(gè)小的濾波器(Filter),并在整個(gè)圖像上滑動(dòng)這個(gè)濾波器。然后,將圖像的像素值與濾波器中的像素值相乘。使用深度學(xué)習(xí)的優(yōu)雅之處在于我們不必考慮這些濾波器應(yīng)該是什么樣的(神經(jīng)網(wǎng)絡(luò)會(huì)自動(dòng)學(xué)習(xí)并選取最佳的濾波器)。通過(guò)隨機(jī)梯度下降(Stohastic Gradient Descent,SGD),網(wǎng)絡(luò)能夠自主學(xué)習(xí)從而達(dá)到最優(yōu)濾波器效果。濾波器被隨機(jī)初始化,并且位置不變。這意味著他們可以在圖像中找到任何物體。同時(shí),該模型還能學(xué)習(xí)到是在這個(gè)圖像的哪個(gè)位置找到這個(gè)物體。

零填充(Zero Padding)是應(yīng)用此濾波器時(shí)的有用工具。這些都是在圖像周?chē)牧阆袼氐念~外邊框 —— 這允許我們?cè)趯V鏡滑過(guò)圖像時(shí)捕獲圖像的邊緣。你可能想知道濾波器應(yīng)該多大,研究表明,較小的濾波器通常表現(xiàn)更好。在這個(gè)例子當(dāng)中,我們使用大小為 3x3 的濾波器。

當(dāng)我們將這些濾波器依次滑過(guò)圖像時(shí),我們基本上創(chuàng)建了另一個(gè)圖像。因此,如果我們的原始圖像是 30x 30 ,則帶有12個(gè)濾鏡的卷積層的輸出將為 30x30x12 ?,F(xiàn)在我們有一個(gè)張量,它基本上是一個(gè)超過(guò) 2 維的矩陣?,F(xiàn)在你也就知道 TensorFlow 的名字從何而來(lái)。

在每個(gè)卷積層(或多個(gè))之后,我們通常就得到了最大池化(Max pooling)層。這個(gè)層會(huì)減少圖像中的像素?cái)?shù)量。例如,我們可以從圖像中取出一個(gè)正方形然后用這個(gè)正方形里面像素的最大值代替這個(gè)正方形。


最大池化

得益于最大池化,我們的濾波器可以探索圖像的較大部分。另外,由于像素?fù)p失,我們通常會(huì)增加使用最大池化后的濾波器數(shù)量。
理論上來(lái)說(shuō),每個(gè)模型架構(gòu)都是可行的并且為你的的問(wèn)題提供一個(gè)很好的解決方案。然而,一些架構(gòu)比其他架構(gòu)要快得多。一個(gè)很差的架構(gòu)可能需要超過(guò)你剩余生命的時(shí)間來(lái)得出結(jié)果。因此,考慮你的模型的架構(gòu)以及我們?yōu)槭裁词褂米畲蟪夭⒏淖兯褂玫臑V波器的數(shù)量是有意義的。為了在 CNN 上完成這個(gè)部分,這個(gè)頁(yè)面提供了一個(gè)很好的視頻,可以將發(fā)生在 CNN 內(nèi)部的事情可視化。

二、欠擬合 vs. 過(guò)擬合

你如何知道你的模型是否欠擬合? 如果你的驗(yàn)證集的準(zhǔn)確度高于訓(xùn)練集,那就是模型欠擬合。此外,如果整個(gè)模型表現(xiàn)得不好,也會(huì)被稱(chēng)為欠擬合。例如,使用線(xiàn)性模型進(jìn)行圖像識(shí)別通常會(huì)出現(xiàn)欠擬合的結(jié)果。也有可能是 Dropout(Dropout)的原因?qū)е履阍谏顚由窠?jīng)網(wǎng)絡(luò)中遇到欠擬合的情況。
Dropout 在模型訓(xùn)練時(shí)隨機(jī)將部分激活函數(shù)設(shè)置為零(讓網(wǎng)絡(luò)某些隱含層節(jié)點(diǎn)的權(quán)重不工作),以避免過(guò)擬合。這種情況一般不會(huì)發(fā)生在驗(yàn)證/測(cè)試集的預(yù)測(cè)中,如果發(fā)生,你可以移除 Dropout來(lái)解決。如果模型現(xiàn)在出現(xiàn)大規(guī)模的過(guò)擬合,你可以開(kāi)始添加小批量的 Dropout

通用法則:從過(guò)度擬合模型開(kāi)始,然后采取措施消除過(guò)擬合。

當(dāng)你的模型過(guò)度適合訓(xùn)練集時(shí),就會(huì)發(fā)生過(guò)擬合。那么模型將難以泛化從而無(wú)法識(shí)別不在訓(xùn)練集中的新例子。例如,你的模型只能識(shí)別你的訓(xùn)練集中的特定圖像,而不是通用模型,同時(shí)你在訓(xùn)練集上的準(zhǔn)確性會(huì)高于驗(yàn)證/測(cè)試集。那么我們可以通過(guò)哪些方法來(lái)減少過(guò)擬合呢?

減少過(guò)擬合的步驟

  1. 添加更多數(shù)據(jù)
  2. 使用數(shù)據(jù)增強(qiáng)
  3. 使用泛化性能更佳的模型結(jié)構(gòu)
  4. 添加正規(guī)化(多數(shù)情況下是 Dropout,L1 / L2正則化也有可能)
  5. 降低模型復(fù)雜性。

第一步當(dāng)然是采集更多的數(shù)據(jù)。但是,在大多數(shù)情況下,你是做不到這一點(diǎn)的。這里我們先假定你采集到了所有的數(shù)據(jù)。下一步是數(shù)據(jù)增強(qiáng):這也是我們一直推薦使用的方法。

數(shù)據(jù)增強(qiáng)包括隨機(jī)旋轉(zhuǎn)圖像、放大圖像、添加顏色濾波器等等。

數(shù)據(jù)增加只適用于訓(xùn)練集而不是驗(yàn)證/測(cè)試集。檢查你是不是使用了過(guò)多的數(shù)據(jù)增強(qiáng)十分有效。例如,如果你那一只貓的圖片放大太多,貓的特征就不再可見(jiàn)了,模型也就不會(huì)通過(guò)這些圖像的訓(xùn)練中獲得更好的效果。下面讓我們來(lái)探索一下數(shù)據(jù)增強(qiáng)!

對(duì)于 Fast AI 課程的學(xué)習(xí)者:請(qǐng)注意教材中使用 “width_zoom_range” 作為數(shù)據(jù)擴(kuò)充參數(shù)之一。但是,這個(gè)選項(xiàng)在 Keras 中不再可用。

原始圖像

現(xiàn)在我們來(lái)看看執(zhí)行數(shù)據(jù)增強(qiáng)后的圖像。所有的“貓”仍然能夠被清楚地識(shí)別出來(lái)。

數(shù)據(jù)增強(qiáng)之后的圖像

第三步是使用泛化性能更佳的模型結(jié)構(gòu)。然而,更重要的是第四步:增加正則化。三個(gè)最受歡迎的選項(xiàng)是:Dropout,L1 正則化和 L2 正則化。我之前提到過(guò),在深入的學(xué)習(xí)中,大部分情況下你看到的都是 Dropout 。Dropout 在訓(xùn)練中刪除隨機(jī)的激活樣本(使其為零)。在 Vgg 模型中,這僅適用于模型末端的完全連接的層。然而,它也可以應(yīng)用于卷積層。要注意的是,Dropout 會(huì)導(dǎo)致信息丟失。如果你在第一層失去了一些信息,那么整個(gè)網(wǎng)絡(luò)就會(huì)丟失這些信息。因此,一個(gè)好的做法是第一層使用較低的Dropout,然后逐漸增加。第五個(gè)也是最后一個(gè)選擇是降低網(wǎng)絡(luò)的復(fù)雜性。實(shí)際上,在大多數(shù)情況下,各種形式的正規(guī)化足以應(yīng)付過(guò)擬合。


左邊是原來(lái)的神經(jīng)網(wǎng)絡(luò),右邊是采用 Dropout 后的網(wǎng)絡(luò)

三、批量歸一化(Batch Normalization )

最后,我們來(lái)討論批量歸一化。這是你永遠(yuǎn)都需要做的事情!批量歸一化是一個(gè)相對(duì)較新的概念,因此在 Vgg 模型中尚未實(shí)現(xiàn)。

如果你對(duì)機(jī)器學(xué)習(xí)有所了解,你一定聽(tīng)過(guò)標(biāo)準(zhǔn)化模型輸入。批量歸一化加強(qiáng)了這一步。批量歸一化在每個(gè)卷積層之后添加“歸一化層”。這使得模型在訓(xùn)練中收斂得更快,因此也允許你使用更高的學(xué)習(xí)率。

簡(jiǎn)單地標(biāo)準(zhǔn)化每個(gè)激活層中的權(quán)重不起作用。隨機(jī)梯度下降非常頑固。如果使得其中一個(gè)比重非常高,那么下一次訓(xùn)練它就會(huì)簡(jiǎn)單地重復(fù)這個(gè)過(guò)程。通過(guò)批量歸一化,模型可以在每次訓(xùn)練中調(diào)整所有的權(quán)重而非僅僅只是一個(gè)權(quán)重。

四、MNIST 數(shù)字識(shí)別

MNIST手寫(xiě)數(shù)字?jǐn)?shù)據(jù)集是機(jī)器學(xué)習(xí)中最著名的數(shù)據(jù)集之一。數(shù)據(jù)集也是一個(gè)檢驗(yàn)我們所學(xué) CNN 知識(shí)的很好的方式。Kaggle也承載了 MNIST 數(shù)據(jù)集。這段我很快寫(xiě)出的代碼,在這個(gè)數(shù)據(jù)集上的準(zhǔn)確度為96.8%。

import pandas as pd
from sklearn.ensemble import RandomForestClassifier

train = pd.read_csv('train_digits.csv')
test = pd.read_csv('test_digits.csv')

X = train.drop('label', axis=1)
y = train['label']

rfc = RandomForestClassifier(n_estimators=300)
pred = rfc.fit(X, y).predict(test)

然而,配備深層 CNN 可以達(dá)到 99.7% 的效果。本周我將嘗試將 CNN 應(yīng)用到這個(gè)數(shù)據(jù)集上,希望我在下周可以報(bào)告最新的準(zhǔn)確率并且討論我所遇到的問(wèn)題。

如果你喜歡這篇文章,歡迎推薦它以便其他人可以看到它。您還可以按照此配置文件跟上我在 fast AI 課程中的進(jìn)度。到時(shí)候見(jiàn)!

譯者注: 翻譯本文的時(shí)候,我事先查閱了一些資料以保證對(duì)于原文有更好的理解,但是由于個(gè)人水平有限等等原因,有些地方表達(dá)的不甚清楚,同時(shí)還添加了一定的輔助參考信息以更好的說(shuō)明問(wèn)題。若讀者在譯文中發(fā)現(xiàn)問(wèn)題,歡迎隨時(shí)與我聯(lián)系或提 issue。

個(gè)人主頁(yè):http://hellogod.cn

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容