簡體   English   中英

Pytorch中model.train()和model.eval()模式下BatchNorm層反向傳播的區別?

[英]The differences of BatchNorm layer backpropagation at mode of model.train() and model.eval() in Pytorch?

我針對兩種模式測試 BatchNorm 層的梯度:model.train() 和 model.eval()。 我構建了一個簡單的 CNN 網絡NetWork ,並在 model.train() 模式和 model.eval() 模式下將相同的輸入 X 輸入網絡。 我知道 BatchNorm 層的 model.train() 和 model.eval() 的區別。 我已將 model.eval() 模式下的 Batchnorm 層的均值和 var 替換為 model.train() 模式下的值。 因此,兩種模式的輸出和參數都是相同的。 output of two mode parameters of two mode但是,當我計算每個參數的梯度時,我發現在 BatchNorm 層之前的層的梯度是不同的,盡管它們的參數和損失是相同的。 BatchNorm 之前層的不同梯度我認為這是因為 BatchNorm 層反向傳播在 model.train() 和 model.eval() 處的差異,但我不明白它的細節。 有人知道嗎? 太感謝了。

當模式為.train() 時,batchnorm 層計算輸入的批量均值和方差,並使用它對輸入進行歸一化。 此均值和方差也用於更新移動平均均值和方差。

當模式為.eval()時,batchnorm層不計算輸入的均值和方差,而是在訓練階段使用預先計算的移動平均均值和方差。

這樣,當批次中的其他樣本發生變化時,您的預測在測試期間不會在單個圖像上發生變化。

https://pytorch.org/docs/stable/_modules/torch/nn/modules/batchnorm.html#BatchNorm2d

在上面的代碼中,運行均值和運行方差是在訓練階段計算的批范數層輸入特征圖的移動平均均值和方差。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM