批規范化與BatchNorm1d學習


1.介紹

https://blog.csdn.net/qq_25737169/article/details/79048516

Batchnorm是深度網絡中經常用到的加速神經網絡訓練,加速收斂速度及穩定性的算法。

在訓練模型時,學習的是數據集的分布,但是如果每一個批次batch分布不同,那么就會給訓練帶來困難;

另一方面,數據經過一層層網絡計算后,其數據分布也在發生着變化,此現象稱為Internal covariant shift,會給下一層的網絡學習帶來困難。

1.1 Internal covariant shift 內部協變量偏移

即:每一次參數迭代更新后,上一層網絡的輸出數據經過這一層網絡計算后,數據的分布會發生變化,為下一層網絡的學習帶來困難。

covariant shift描述的是訓練數據和測試數據存在分布的差異性,給網絡的泛化性和訓練速度帶來了影響。

//鏈接中有個圖講的很好,經過數據歸一化,就能加快訓練速度,因為b一般初始化為0?

2.原理

 對每一層的輸出后的數據做歸一化,加入可訓練的參數做歸一化,其實過程非常簡單。

 β是平移參數,γ是縮放參數。如果γ=σ,β=μ參數,那么y就取消了歸一化。所以,綜上保證了每一次數據經過歸一化后還保留的有學習來的特征,同時又能完成歸一化這個操作,加速訓練。

3.代碼

def Batchnorm_simple_for_train(x, gamma, beta, bn_param):
"""
param:x    : 輸入數據,設shape(B,L)
param:gama : 縮放因子  γ
param:beta : 平移因子  β
param:bn_param   : batchnorm所需要的一些參數
    eps      : 接近0的數,防止分母出現0
    momentum : 動量參數,一般為0.90.990.999
    running_mean :滑動平均的方式計算新的均值,訓練時計算,為測試數據做准備
    running_var  : 滑動平均的方式計算新的方差,訓練時計算,為測試數據做准備
"""
    running_mean = bn_param['running_mean']  #shape = [B]
    running_var = bn_param['running_var']    #shape = [B]
    results = 0. # 建立一個新的變量
    
    x_mean=x.mean(axis=0)  # 計算x的均值
    x_var=x.var(axis=0)    # 計算方差
    x_normalized=(x-x_mean)/np.sqrt(x_var+eps)       # 歸一化
    results = gamma * x_normalized + beta            # 縮放平移

    running_mean = momentum * running_mean + (1 - momentum) * x_mean
    running_var = momentum * running_var + (1 - momentum) * x_var
    
    #記錄新的值
    bn_param['running_mean'] = running_mean
    bn_param['running_var'] = running_var 
    
    return results , bn_param

其實上述running_mean和var在訓練過程中沒有用到,主要作用是在測試集的時候用到,因為測試集它是針對一個樣本,不存在均值。

在訓練過程中,是直接取running_mean和running_var的, 

4.BatchNorm1d用法

https://pytorch.org/docs/stable/nn.html

https://blog.csdn.net/qsmx666/article/details/109527726

  • num_features – 特征維度
  • eps – 為數值穩定性而加到分母上的值。
  • momentum – 移動平均的動量值。
  • affine – 一個布爾值,當設置為真時,此模塊具有可學習的仿射參數。

 其中γ默認為1,β默認為0,並且x是特征,不是樣本。。從下面的例子中可以看出:

復制代碼
import torch.nn as  nn
import torch
m = nn.BatchNorm1d(3)
input = torch.randn(2, 3)
output = m(input)

#輸出
>>> output
tensor([[-0.9762,  0.3067, -0.5193],#做一個歸一化
        [ 0.9762, -0.3067,  0.5193]], grad_fn=<NativeBatchNormBackward>)
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM