個人主頁:http://hellogod.cn
什么是卷積、最大池化和 Dropout窝爪?
歡迎來到本系列教程的第三部分的學(xué)習(xí)!這周我會講解一些卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)的內(nèi)容并且討論如何解決欠擬合
和過擬合
。
一蛤奢、卷積(Convolution)
那么究竟什么是卷積呢?你可能還記得我之前的博客陶贼,我們使用了一個小的濾波器(Filter)啤贩,并在整個圖像上滑動這個濾波器。然后骇窍,將圖像的像素值與濾波器中的像素值相乘瓜晤。使用深度學(xué)習(xí)的優(yōu)雅之處在于我們不必考慮這些濾波器應(yīng)該是什么樣的(神經(jīng)網(wǎng)絡(luò)會自動學(xué)習(xí)并選取最佳的濾波器)锥余。通過隨機梯度下降(Stohastic Gradient Descent,SGD)腹纳,網(wǎng)絡(luò)能夠自主學(xué)習(xí)從而達到最優(yōu)濾波器效果。濾波器被隨機初始化驱犹,并且位置不變嘲恍。這意味著他們可以在圖像中找到任何物體。同時雄驹,該模型還能學(xué)習(xí)到是在這個圖像的哪個位置找到這個物體佃牛。
零填充(Zero Padding)是應(yīng)用此濾波器時的有用工具。這些都是在圖像周圍的零像素的額外邊框 —— 這允許我們在將濾鏡滑過圖像時捕獲圖像的邊緣医舆。你可能想知道濾波器應(yīng)該多大俘侠,研究表明象缀,較小的濾波器通常表現(xiàn)更好。在這個例子當(dāng)中爷速,我們使用大小為 3x3 的濾波器央星。
當(dāng)我們將這些濾波器依次滑過圖像時,我們基本上創(chuàng)建了另一個圖像惫东。因此莉给,如果我們的原始圖像是 30x 30 ,則帶有12個濾鏡的卷積層的輸出將為 30x30x12 ×冢現(xiàn)在我們有一個張量颓遏,它基本上是一個超過 2 維的矩陣。現(xiàn)在你也就知道 TensorFlow 的名字從何而來滞时。
在每個卷積層(或多個)之后叁幢,我們通常就得到了最大池化(Max pooling)層。這個層會減少圖像中的像素數(shù)量坪稽。例如遥皂,我們可以從圖像中取出一個正方形然后用這個正方形里面像素的最大值代替這個正方形。
得益于最大池化刽漂,我們的濾波器可以探索圖像的較大部分演训。另外,由于像素損失贝咙,我們通常會增加使用最大池化后的濾波器數(shù)量样悟。
理論上來說,每個模型架構(gòu)都是可行的并且為你的的問題提供一個很好的解決方案庭猩。然而窟她,一些架構(gòu)比其他架構(gòu)要快得多。一個很差的架構(gòu)可能需要超過你剩余生命的時間來得出結(jié)果蔼水。因此震糖,考慮你的模型的架構(gòu)以及我們?yōu)槭裁词褂米畲蟪夭⒏淖兯褂玫臑V波器的數(shù)量是有意義的。為了在 CNN 上完成這個部分趴腋,這個頁面提供了一個很好的視頻吊说,可以將發(fā)生在 CNN 內(nèi)部的事情可視化。
二优炬、欠擬合 vs. 過擬合
你如何知道你的模型是否欠擬合颁井? 如果你的驗證集的準(zhǔn)確度高于訓(xùn)練集,那就是模型欠擬合蠢护。此外雅宾,如果整個模型表現(xiàn)得不好,也會被稱為欠擬合葵硕。例如眉抬,使用線性模型進行圖像識別通常會出現(xiàn)欠擬合的結(jié)果贯吓。也有可能是 Dropout(Dropout)的原因?qū)е履阍谏顚由窠?jīng)網(wǎng)絡(luò)中遇到欠擬合的情況。
Dropout 在模型訓(xùn)練時隨機將部分激活函數(shù)設(shè)置為零(讓網(wǎng)絡(luò)某些隱含層節(jié)點的權(quán)重不工作)蜀变,以避免過擬合宣决。這種情況一般不會發(fā)生在驗證/測試集的預(yù)測中,如果發(fā)生昏苏,你可以移除 Dropout
來解決尊沸。如果模型現(xiàn)在出現(xiàn)大規(guī)模的過擬合,你可以開始添加小批量的 Dropout
贤惯。
通用法則:從過度擬合模型開始洼专,然后采取措施消除過擬合。
當(dāng)你的模型過度適合訓(xùn)練集時孵构,就會發(fā)生過擬合屁商。那么模型將難以泛化從而無法識別不在訓(xùn)練集中的新例子。例如颈墅,你的模型只能識別你的訓(xùn)練集中的特定圖像蜡镶,而不是通用模型,同時你在訓(xùn)練集上的準(zhǔn)確性會高于驗證/測試集恤筛。那么我們可以通過哪些方法來減少過擬合呢官还?
減少過擬合的步驟
- 添加更多數(shù)據(jù)
- 使用數(shù)據(jù)增強
- 使用泛化性能更佳的模型結(jié)構(gòu)
- 添加正規(guī)化(多數(shù)情況下是 Dropout,L1 / L2正則化也有可能)
- 降低模型復(fù)雜性毒坛。
第一步當(dāng)然是采集更多的數(shù)據(jù)望伦。但是,在大多數(shù)情況下煎殷,你是做不到這一點的屯伞。這里我們先假定你采集到了所有的數(shù)據(jù)。下一步是數(shù)據(jù)增強:這也是我們一直推薦使用的方法豪直。
數(shù)據(jù)增強包括隨機旋轉(zhuǎn)圖像劣摇、放大圖像、添加顏色濾波器等等弓乙。
數(shù)據(jù)增加只適用于訓(xùn)練集而不是驗證/測試集末融。檢查你是不是使用了過多的數(shù)據(jù)增強十分有效。例如唆貌,如果你那一只貓的圖片放大太多滑潘,貓的特征就不再可見了,模型也就不會通過這些圖像的訓(xùn)練中獲得更好的效果锨咙。下面讓我們來探索一下數(shù)據(jù)增強!
對于 Fast AI 課程的學(xué)習(xí)者:請注意教材中使用 “width_zoom_range” 作為數(shù)據(jù)擴充參數(shù)之一追逮。但是酪刀,這個選項在 Keras 中不再可用粹舵。
現(xiàn)在我們來看看執(zhí)行數(shù)據(jù)增強后的圖像。所有的“貓”仍然能夠被清楚地識別出來骂倘。
第三步是使用泛化性能更佳的模型結(jié)構(gòu)眼滤。然而,更重要的是第四步:增加正則化历涝。三個最受歡迎的選項是:Dropout诅需,L1 正則化和 L2 正則化。我之前提到過荧库,在深入的學(xué)習(xí)中堰塌,大部分情況下你看到的都是 Dropout 。Dropout 在訓(xùn)練中刪除隨機的激活樣本(使其為零)分衫。在 Vgg 模型中场刑,這僅適用于模型末端的完全連接的層。然而蚪战,它也可以應(yīng)用于卷積層牵现。要注意的是,Dropout 會導(dǎo)致信息丟失邀桑。如果你在第一層失去了一些信息瞎疼,那么整個網(wǎng)絡(luò)就會丟失這些信息。因此壁畸,一個好的做法是第一層使用較低的Dropout丑慎,然后逐漸增加。第五個也是最后一個選擇是降低網(wǎng)絡(luò)的復(fù)雜性瓤摧。實際上竿裂,在大多數(shù)情況下,各種形式的正規(guī)化足以應(yīng)付過擬合照弥。
左邊是原來的神經(jīng)網(wǎng)絡(luò)腻异,右邊是采用 Dropout 后的網(wǎng)絡(luò)
三、批量歸一化(Batch Normalization )
最后这揣,我們來討論批量歸一化悔常。這是你永遠都需要做的事情!批量歸一化是一個相對較新的概念给赞,因此在 Vgg 模型中尚未實現(xiàn)机打。
如果你對機器學(xué)習(xí)有所了解,你一定聽過標(biāo)準(zhǔn)化模型輸入片迅。批量歸一化加強了這一步残邀。批量歸一化在每個卷積層之后添加“歸一化層”。這使得模型在訓(xùn)練中收斂得更快,因此也允許你使用更高的學(xué)習(xí)率芥挣。
簡單地標(biāo)準(zhǔn)化每個激活層中的權(quán)重不起作用驱闷。隨機梯度下降非常頑固。如果使得其中一個比重非常高空免,那么下一次訓(xùn)練它就會簡單地重復(fù)這個過程空另。通過批量歸一化,模型可以在每次訓(xùn)練中調(diào)整所有的權(quán)重而非僅僅只是一個權(quán)重蹋砚。
四扼菠、MNIST 數(shù)字識別
MNIST手寫數(shù)字數(shù)據(jù)集是機器學(xué)習(xí)中最著名的數(shù)據(jù)集之一。數(shù)據(jù)集也是一個檢驗我們所學(xué) CNN 知識的很好的方式坝咐。Kaggle也承載了 MNIST 數(shù)據(jù)集循榆。這段我很快寫出的代碼,在這個數(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 可以達到 99.7% 的效果。本周我將嘗試將 CNN 應(yīng)用到這個數(shù)據(jù)集上框杜,希望我在下周可以報告最新的準(zhǔn)確率并且討論我所遇到的問題浦楣。
如果你喜歡這篇文章,歡迎推薦它以便其他人可以看到它咪辱。您還可以按照此配置文件跟上我在 fast AI 課程中的進度振劳。到時候見!
譯者注: 翻譯本文的時候油狂,我事先查閱了一些資料以保證對于原文有更好的理解历恐,但是由于個人水平有限等等原因,有些地方表達的不甚清楚专筷,同時還添加了一定的輔助參考信息以更好的說明問題弱贼。若讀者在譯文中發(fā)現(xiàn)問題,歡迎隨時與我聯(lián)系或提 issue磷蛹。
個人主頁:http://hellogod.cn