【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
針對圖像識別領域,一般來講
W = np.random.randn(in, out) / sqrt(in/2)