pytorch批量歸一化學習小總結

2021-10-03 22:23:18 字數 1264 閱讀 8152

卷積層之後的輸出是4維(m,c,p,q),全連線層之後的輸出是2維(m,d)m是batchsize,d是神經元個數 。卷積是對 m x p x q 做歸一化,全連線是對d做歸一化 。

訓練時,歸一化是以batch為單位對每個batch計算均值和方差。測試時,使用移動平均估算整個訓練資料的樣本均值和方差。

這是因為**時不是一batch一batch這樣的**,而是要對每個傳入樣本給出**結果,所以沒有訓練時那樣的均值和誤差作為參考,所以估算整個樣本訓練集的均值和方差來對**資料做標準化,使用的方法叫做移動平均法。

1、batch_norm函式中的x是需要標準化的目標,可能是全連線層仿射變換後的輸出,也可能是卷積層卷積之後的輸出,我們需要把x標準化為期望為0方差為1的x_hat。

2、先判斷是**還是訓練,moving_mean是訓練集的樣本均值,moving_var是訓練集的樣本標準差,訓練集以batch為單位求每個batch的均值和標準差

3、在訓練情況下,先看x的形狀是2維還是4維,2維對應全連線仿射變換後的輸出,4維對應的是卷積之後的輸出。

4、tensor.mean(axis, keepdim)引數理解:

6、移動平均法:前面說過測試時的bn使用的均值和方差是用訓練資料集整體的均值和方差 ,但我們不能直接拿整個訓練資料集去估計其期望和方差,不太現實。所以引入動量momentum(超引數,乙個比例),用移動平均去接近訓練集整體的期望和方差。

moving_mean = momentum * moving_mean+(1.0-momentum) * mean

moving_var = momentum * moving_var+(1.0-momentum) * var

訓練之前先設定moving_mean和moving_var初值為0,然後訓練過程中自己更新,訓練完成後便可以在測試中使用

7、定義完batch_norm函式,再定義batch_norm類,該類主要是維護學習引數和超引數。其有兩個輸入引數:

8、在y=gamma * x_hat +beta中,gamma初值的形狀是根據全連線層輸出神經元形狀(1,num_features) 或者全連線層輸出的形狀(1,num_features,1,1)來設定的。故跟x_hat的形狀不相同,在按元素相乘是會用到廣播機制,自動擴充,beta同理。

9、在batch_norm類中定義forward函式,將定義好的batch_norm函式定義在forward中,並返回y;這樣例項化後不用再關注batch_norm函式,直接forward就可以得到y。

批量歸一化

批量歸一化實際上也是乙個層,可以直接呼叫torch的api。我們在訓練頂部的層,實際上幹的就是在擬合底部層。所以頂部的層會收斂的很快,但是底部的層資料變化後,頂部又要重新進行訓練。乙個簡單的實現就是將分布的均值和方差進行固定。這個實現也很簡單。mu frac sum x text sigma fra...

強化學習 Pytorch篇

首先祭出強化學習中的基礎方法q learning,演算法流程如下圖所示 q learning是乙個不斷摸索,最終找到最優的方法。個人理解是這樣的 首先q表是乙個初值都為0 的表,被學習體只能隨意摸索。當得到reward之後,乘以學習率 alpha 更新q表。這樣,在下一次走到這一步的時候,就能夠根據...

虛擬化學習小總結

這幾天看了一點虛擬化的東西,感覺這個比較簡單 學過計算機原理 不說沒有的了。簡單的總結一下自己對於虛擬化的一些看法吧。我學習虛擬化是為了了解一下,虛擬容器docker的一些東西。但是因為虛擬容器docker,我覺的會是在今後幾年,實用性特別強的東西。在聽過了王家林老師的docker課後,發現這個東西...