Pytorch中關於BatchNorm2d的參數解釋

BatchNorm2d中的track_running_stats參數

如果BatchNorm2d的參數val,track_running_stats設置False,那麼加載預訓練後每次模型測試測試集的結果時都不一樣;

track_running_stats設置為True時,每次得到的結果都一樣。

running_mean和running_var參數

running_mean和running_var參數是根據輸入的batch的統計特性計算的,嚴格來說不算是“學習”到的參數,不過對於整個計算是很重要的。

torch.nn.BatchNorm1d(num_features,
eps=1e-05,
momentum=0.1,
affine=True,
track_running_stats=True)

BatchNorm2d參數講解

一般來說pytorch中的模型都是繼承nn.Module類的,都有一個屬性trainning指定是否是訓練狀態,訓練狀態與否將會影響到某些層的參數是否是固定的,比如BN層或者Dropout層。通常用model.train()指定當前模型model為訓練狀態,model.eval()指定當前模型為測試狀態。

同時,BN的API中有幾個參數需要比較關心的,一個是affine指定是否需要仿射,還有個是track_running_stats指定是否跟蹤當前batch的統計特性。容易出現問題也正好是這三個參數:trainning,affine,track_running_stats。

其中的affine指定是否需要仿射,也就是是否需要上面算式的第四個,如果affine=False則γ=1,β=0 \gamma=1,\beta=0γ=1,β=0,並且不能學習被更新。一般都會設置成affine=True。

trainning和track_running_stats,track_running_stats=True表示跟蹤整個訓練過程中的batch的統計特性,得到方差和均值,而不隻是僅僅依賴與當前輸入的batch的統計特性。相反的,如果track_running_stats=False那麼就隻是計算當前輸入的batch的統計特性中的均值和方差瞭。當在推理階段的時候,如果track_running_stats=False,此時如果batch_size比較小,那麼其統計特性就會和全局統計特性有著較大偏差,可能導致糟糕的效果。

總結

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: