繁体   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