【DL-CV】數據預處理&權重初始化

【DL-CV】卷積神經網路<前篇---後篇>【DL-CV】批量歸一化(BN算法)python

數據預處理

在網絡訓練時,咱們一般會對原始數據進行預處理再餵給網絡進行訓練,而不是直接把原始數據餵給網絡。這樣能減小訓練時問題的發生,提升網絡模型的性能。如今咱們有原始數據 X,其尺寸是 NxD(N是數據樣本數量,D是數據的維度)算法

均值減法

均值減法(Mean subtraction)是預處理最經常使用的形式,將數據的每一維特徵都減去平均值便可,在numpy的實現是X -= np.mean(X, axis=0),它能使數據零中心化segmentfault


另外還有一些相似的方法對圖像數據預處理來講也極可能用到:網絡

  • 直接減去整個數據的均值,X -= np.mean(X),對於圖像,能夠移除圖像的平均亮度值,由於不少狀況下咱們對圖像亮度並不感興趣,而是關注其內容,因此將圖像總體減去像素均值是有意義的
  • 減去每一個顏色通道上的均值

歸一化

歸一化(Normalization)也是一種預處理的方法,他將數據的全部維度都歸一化,使其數值範圍都近似相等。先對數據作零中心化處理,而後每一個維度都除以其標準差dom

x = x - np.mean(x, axis=0)
x = x / np.std(x, axis=0)

除此以外,預處理方法還有PCA和白化,但在圖像處理這一塊他們用得並非不少,這裏就不講了,有興趣自查。在圖像識別領域,更經常使用的是零中心化和歸一化,特別是零中心化
零中心化在使用時,先將樣本數據分紅訓練/驗證/測試集,從訓練集中求得平均值,而後將各個集(訓練/驗證/測試集)中的數據再減去這個均值。函數

權重初始化

首先,全零初始化想一想都知道確定是錯的。性能

而後,小隨機數初始化如W = 0.01 * np.random.randn(D,H)是能夠的(randn函數是基於零均值和標準差的一個高斯分佈),不過不是越小越好,權重初始化的過小的話計算出來的激活值會很小,在反向傳播中就會獲得很小的梯度,後果你知道的。測試

可是,還不是最好的,小隨機數初始化有一個問題就是隨着輸入數據量的增加,隨機初始神經元輸出數據的方差也增大,這樣網絡一深問題就大了。解決方法是:除以輸入數據量的平方根來調整數值範圍,使神經元輸出的方差歸一化爲1,也就是W = np.random.randn(in, out) / sqrt(in) ,其中in是輸入數據的數量(若W尺寸 DxH ,則in=D,out=H)。這種更厲害的方法叫作 Xavier初始化,他保證了網絡中全部神經元起始時有近似一樣的輸出分佈。實踐經驗證實,這樣作能夠提升收斂的速度。code

《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》論文指出,使用relu激活函數的網絡,因爲一半的激活值變成了0,至關於一半的輸入數據量是對方差無貢獻的,爲保持輸入輸出的方差維持不變,初始化方法也做了相應改變(根號中的數據量除以二): W = np.random.randn(in, out) / sqrt(in/2) ,這是針對使用relu的初始化方法。orm

至於偏置值,一般初始化爲0

總結

針對圖像識別領域,一般來講

  • 數據預處理使用零中心化
  • 權重初始化使用Xavier;如網絡使用relu,使用W = np.random.randn(in, out) / sqrt(in/2)
  • 偏置值初始化爲0
相關文章
相關標籤/搜索