【譯】如何應對 CNN 中的過擬合問題

摘要:理解神經卷積網絡、欠擬合 & 過擬合、批量歸一化git

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

這篇文章是深度學習系列中一篇文章。請查看#系列1#系列2github

數據加強(Data augmentation)
數據加強(Data augmentation)

歡迎來到本系列教程的第三部分的學習!這周我會講解一些卷積神經網絡(Convolutional Neural Network, CNN)的內容而且討論如何解決欠擬合過擬合bash

1、卷積(Convolution)

那麼究竟什麼是卷積呢?你可能還記得我以前的博客,咱們使用了一個小的濾波器(Filter),並在整個圖像上滑動這個濾波器。而後,將圖像的像素值與濾波器中的像素值相乘。使用深度學習的優雅之處在於咱們沒必要考慮這些濾波器應該是什麼樣的(神經網絡會自動學習並選取最佳的濾波器)。經過隨機梯度降低(Stohastic Gradient Descent,SGD),網絡可以自主學習從而達到最優濾波器效果。濾波器被隨機初始化,而且位置不變。這意味着他們能夠在圖像中找到任何物體。同時,該模型還能學習到是在這個圖像的哪一個位置找到這個物體。網絡

零填充(Zero Padding)是應用此濾波器時的有用工具。這些都是在圖像周圍的零像素的額外邊框 —— 這容許咱們在將濾鏡滑過圖像時捕獲圖像的邊緣。你可能想知道濾波器應該多大,研究代表,較小的濾波器一般表現更好。在這個例子當中,咱們使用大小爲 3x3 的濾波器。架構

當咱們將這些濾波器依次滑過圖像時,咱們基本上建立了另外一個圖像。所以,若是咱們的原始圖像是 30x 30 ,則帶有12個濾鏡的卷積層的輸出將爲 30x30x12 。如今咱們有一個張量,它基本上是一個超過 2 維的矩陣。如今你也就知道 TensorFlow 的名字從何而來。dom

在每一個卷積層(或多個)以後,咱們一般就獲得了最大池化(Max pooling)層。這個層會減小圖像中的像素數量。例如,咱們能夠從圖像中取出一個正方形而後用這個正方形裏面像素的最大值代替這個正方形。
機器學習

最大池化
最大池化

得益於最大池化,咱們的濾波器能夠探索圖像的較大部分。另外,因爲像素損失,咱們一般會增長使用最大池化後的濾波器數量。
理論上來講,每一個模型架構都是可行的而且爲你的的問題提供一個很好的解決方案。然而,一些架構比其餘架構要快得多。一個不好的架構可能須要超過你剩餘生命的時間來得出結果。所以,考慮你的模型的架構以及咱們爲何使用最大池並改變所使用的濾波器的數量是有意義的。爲了在 CNN 上完成這個部分,這個頁面提供了一個很好的視頻,能夠將發生在 CNN 內部的事情可視化。函數

2、欠擬合 vs. 過擬合

你如何知道你的模型是否欠擬合? 若是你的驗證集的準確度高於訓練集,那就是模型欠擬合。此外,若是整個模型表現得很差,也會被稱爲欠擬合。例如,使用線性模型進行圖像識別一般會出現欠擬合的結果。也有多是 Dropout(Dropout)的緣由致使你在深層神經網絡中遇到欠擬合的狀況。
Dropout 在模型訓練時隨機將部分激活函數設置爲零(讓網絡某些隱含層節點的權重不工做),以免過擬合。這種狀況通常不會發生在驗證/測試集的預測中,若是發生,你能夠移除 Dropout來解決。若是模型如今出現大規模的過擬合,你能夠開始添加小批量的 Dropout工具

通用法則:從過分擬合模型開始,而後採起措施消除過擬合。性能

當你的模型過分適合訓練集時,就會發生過擬合。那麼模型將難以泛化從而沒法識別不在訓練集中的新例子。例如,你的模型只能識別你的訓練集中的特定圖像,而不是通用模型,同時你在訓練集上的準確性會高於驗證/測試集。那麼咱們能夠經過哪些方法來減小過擬合呢?

減小過擬合的步驟

  1. 添加更多數據
  2. 使用數據加強
  3. 使用泛化性能更佳的模型結構
  4. 添加正規化(多數狀況下是 Dropout,L1 / L2正則化也有可能)
  5. 下降模型複雜性。

第一步固然是採集更多的數據。可是,在大多數狀況下,你是作不到這一點的。這裏咱們先假定你採集到了全部的數據。下一步是數據加強:這也是咱們一直推薦使用的方法。

數據加強包括隨機旋轉圖像、放大圖像、添加顏色濾波器等等。

數據增長只適用於訓練集而不是驗證/測試集。檢查你是否是使用了過多的數據加強十分有效。例如,若是你那一隻貓的圖片放大太多,貓的特徵就再也不可見了,模型也就不會經過這些圖像的訓練中得到更好的效果。下面讓咱們來探索一下數據加強!

對於 Fast AI 課程的學習者:請注意教材中使用 「width_zoom_range」 做爲數據擴充參數之一。可是,這個選項在 Keras 中再也不可用。

原始圖像
原始圖像

如今咱們來看看執行數據加強後的圖像。全部的「貓」仍然可以被清楚地識別出來。

數據加強以後的圖像
數據加強以後的圖像

第三步是使用泛化性能更佳的模型結構。然而,更重要的是第四步:增長正則化。三個最受歡迎的選項是:Dropout,L1 正則化和 L2 正則化。我以前提到過,在深刻的學習中,大部分狀況下你看到的都是 Dropout 。Dropout 在訓練中刪除隨機的激活樣本(使其爲零)。在 Vgg 模型中,這僅適用於模型末端的徹底鏈接的層。然而,它也能夠應用於卷積層。要注意的是,Dropout 會致使信息丟失。若是你在第一層失去了一些信息,那麼整個網絡就會丟失這些信息。所以,一個好的作法是第一層使用較低的Dropout,而後逐漸增長。第五個也是最後一個選擇是下降網絡的複雜性。實際上,在大多數狀況下,各類形式的正規化足以應付過擬合。

左邊是原來的神經網絡,右邊是採用 Dropout 後的網絡

3、批量歸一化(Batch Normalization )

最後,咱們來討論批量歸一化。這是你永遠都須要作的事情!批量歸一化是一個相對較新的概念,所以在 Vgg 模型中還沒有實現。

若是你對機器學習有所瞭解,你必定聽過標準化模型輸入。批量歸一化增強了這一步。批量歸一化在每一個卷積層以後添加「歸一化層」。這使得模型在訓練中收斂得更快,所以也容許你使用更高的學習率。

簡單地標準化每一個激活層中的權重不起做用。隨機梯度降低很是頑固。若是使得其中一個比重很是高,那麼下一次訓練它就會簡單地重複這個過程。經過批量歸一化,模型能夠在每次訓練中調整全部的權重而非僅僅只是一個權重。

4、MNIST 數字識別

MNIST手寫數字數據集是機器學習中最着名的數據集之一。數據集也是一個檢驗咱們所學 CNN 知識的很好的方式。Kaggle也承載了 MNIST 數據集。這段我很快寫出的代碼,在這個數據集上的準確度爲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 應用到這個數據集上,但願我在下週能夠報告最新的準確率而且討論我所遇到的問題。

若是你喜歡這篇文章,歡迎推薦它以便其餘人能夠看到它。您還能夠按照此配置文件跟上我在 fast AI 課程中的進度。到時候見!

譯者注: 翻譯本文的時候,我事先查閱了一些資料以保證對於原文有更好的理解,可是因爲我的水平有限等等緣由,有些地方表達的不甚清楚,同時還添加了必定的輔助參考信息以更好的說明問題。若讀者在譯文中發現問題,歡迎隨時與我聯繫或提 issue。

相關文章
相關標籤/搜索