深度學習入門教程:一文看懂提升卷積神經網絡效果的一些技巧

本教程由深度學習中文社區(dl.tustcs.com)持續發佈與更新, 本系列其餘教程地址見文章末尾.

前言

本文主要介紹比較廣泛的實用技巧,以用於建立和訓練自己的深層網絡。主要包括在一下幾個方面:1)數據增強;2)圖像預處理;3)網絡的初始化;4)訓練期間的小技巧;5)激活函數的選擇;6)正則化策略.

深度學習入門教程:一文看懂提升卷積神經網絡效果的一些技巧

1.數據增強

如果原始圖像數據集包含的訓練圖像有限,而對於深度網絡一般需要大量的訓練圖像數據才能取得一個較好的性能,所以我們最好通過數據增強以提高性能。此外,數據增強成為訓練深度網絡時必須做的事情。

有許多方法可以進行數據增強,例如比較流行的水平翻轉,隨機修剪和光照、彩色變換。此外,也可以嘗試多種不同處理的組合,例如,同時進行旋轉和隨機縮放。此外,您可以嘗試將所有像素的飽和度和值(HSV彩色空間的S和V分量)提高到0.25和4倍之間的倍數(對於一個色塊內的所有像素都相同),將這些值乘以係數0.7和1.4,並且向它們添加一個在[-0.1,0.1]範圍內的值。此外,也可以添加一個[-0.1,0.1]的值在圖像/塊中所有像素的色調上(HSV的H分量)。

Krizhevsky等人在2012年訓練AlexNet時,提出了 PCA 方式,利用PCA改變訓練圖像中RGB通道的強度。在實際中,我們可以在整個訓練圖像中的RGB像素值集合上執行PVA ,然後對於每個訓練圖像,只需要將以下向量加到每個RGB圖像像素中 。其中, 和 是RGB像素值的3*3協方差矩陣的第i個特徵向量和特徵值, 是均值為0的標準差為0.1的高斯分佈隨機變量。

2.預處理

在自己獲取的圖像樣本上,在網絡的訓練之前還需要做預處理操作。第一個簡單的預處理操作數據以0點為中心,然後做規範化操作,在Python中的操作為下面兩行代碼:

>>> X -= np.mean(X, axis = 0)# zero-center

>>> X /= np.std(X, axis = 0)# normalize

X為輸出數據,這種預處理的另一種形式是使每個維度歸一化,使得維度上的最小和最大值分別為-1和1。在不同的輸入特徵具有不同的尺度(或單位)時,應用此預處理是有意義的。在輸入是圖像的情況下,像素的相對尺度已經近似相等(並且在0到255的範圍內),所以執行這個預處理步驟並不是絕對必要的。

另外一種預處理是PCA白化,數據如第一種方式一樣居中處理,然後計算數據結構中相關的協方差矩陣:

>>> X -= np.mean(X, axis = 0) # zero-center

>>> cov = np.dot(X.T, X) / X.shape[0] # compute the covariance matrix

然後,通過將原始(以零為中心)的數據投射到eigenbasis中,將數據解相關:

>>> U,S,V = np.linalg.svd(cov) # compute the SVD factorization of the data covariance matrix

>>> Xrot = np.dot(X, U) # decorrelate the data

最後一個轉化是白化,它將數據放在eigenbasis中,並通過在每個維度中除以特徵值去規範化尺度:

>>> Xwhite = Xrot / np.sqrt(S + 1e-5) # divide by the eigenvalues (which are square roots of the singular values)

3.網絡的初始化

(1)全零初始化

在理想情況下,通過適當的數據歸一化,可以合理的預測大約一半的權重權重為正數,一半權重將為負數。假設一個合理的想法是可以將所有的初始權重設置為零,但是,這是一個錯誤的權重初始化方式。因為如果網絡中的每個神經元計算相同的輸出,那麼它們在反向傳播過程中也將計算相同的梯度,並進行完全相同的參數更新。換句話說,如果神經元的權重初始化為相同,則不存在不對稱的來源。

(2)小隨機數初始化

在ResNet網絡中,就認為網絡的權值是一個近似0但是不等於0的值,而且驗證了該假設的合理性。所以,我們在網絡中可以將這些神經元隨機初始到非常接近於零的權值。權重的實現可以簡單地表達為0.001*N(0,1),其中N(0,1)是均值為0,標準差為1的高斯分佈。也可以使用均勻分佈的初始化權值,這對最終的權值結果沒有太大的影響。

(3)權值歸一化

上述方案的一個問題是隨機初始化神經元權值的輸出分佈的方差隨著輸入樣本量而增加。通過實驗證明,可以將每個神經元輸出的方差歸一化為1,通過將其權重向量按其輸入數的平方根進行縮放,如下所示:

>>> w = np.random.randn(n) /sqrt(n)# calibratingthe variances with 1/sqrt(n)

4.訓練期間的小技巧

卷積核和池化窗口的大小。

在訓練期間,輸入圖像的大小更傾向於2的倍數,例如32,64,224,384或512等。另外,重要的是採用小的卷積核(例如3×3)和小步長(例如1)進行填充為0的卷積計算,這不僅減少了參數數量,而且提高了整個深度網絡的準確率。 同時,上述的參數設置,即具有步幅1的3×3卷積核,可以保留圖像或特徵圖的空間尺寸。對於池化層,常用的池化窗口大小為2×2。

學習速率

一般來說,學習率根據微型批次(mini-batch-size)的大小來決定。但是當更改微型批次的大小時,我們不可能總是再更改學習率。通常,在訓練開始時的學習率為0.1,在訓練集上損失值不在下降時,然後將學習率除以2(或者5),然後繼續進行訓練,可能會取得不錯的效果。

預訓練模型的微調

由於預先訓練的深度模型良好的泛化能力,我們可以直接在其他數據集的訓練時,採用這些預先訓練的模型。在其他數據集訓練時,比較注意的是數據集的大小,以及它與原始數據集的相似度,這在網絡的微調過程中還是很重要的。

5.激活函數

激活函數是作用於卷積層和全連接層之後的非線性計算操作,目前主要的激活函數有tanh、Sigmoid、ReLU、PReLU等函數

6.正則化(regularization)

神經網絡防止過擬合的方法有以下方法:

  1. L2正則化是正則化最常用的形式之一,可以直接在損失函數中加上帶有乘性偏置的所有權值w的平方和來實現。
  2. L1正則化是正則化中相對常見的形式,在原始的代價函數後面加上一個L1正則化項,即所有權重w的絕對值的和,乘以λ/n。
  3. 最大範圍限制,正則化的另一種形式是強制每個神經元的權重的絕對上限,並使用預測的梯度下降來強制約束。
  4. Dropout是一個很簡單的正則化技術,dropout策略是以一定的概率(dropout ratio)將隱層神經元的輸入、輸出設置為零。選中“dropped out”的隱層神經元在網絡中既不參與前向傳播,也不參與誤差的反向傳播,但是它的權重會保留下來。所以每次輸入樣本進行訓練,該卷積神經網絡就相當於採用了與先前不同的網絡結構,但是不同網絡結構之間的權重是共享的。
  5. Batch Normalization是最近最為流行的防止過擬合的方法,也有正則化的作用。BN是在卷積計算和激活函數中間進行規範化計算,逐層尺度歸一,首先通過對相應的激活區域做規範化操作,使得輸出信號各個維度服從均值為0,標準差為1的正態分佈,最後通過縮放和平移(scale and shift)操作讓批規範化計算輸出的結果還原最初的輸入特徵,從而保證網絡的容納能力。


分享到:


相關文章: