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。
推薦閱讀:
- pytorch中LN(LayerNorm)及Relu和其變相的輸出操作
- 解決Pytorch中Batch Normalization layer踩過的坑
- 聊聊pytorch測試的時候為何要加上model.eval()
- PyTorch 遷移學習實踐(幾分鐘即可訓練好自己的模型)
- Pytorch 中net.train 和 net.eval的使用說明