0

我为两种模式测试 BatchNorm 层的梯度:model.train() 和 model.eval()。我构建了一个简单的 CNN 网络NetWork,并在 model.train() 模式和 model.eval() 模式下将相同的输入 X 输入到网络。我知道 BatchNorm 层的 model.train() 和 model.eval() 的区别。我已将 model.eval() 模式中 Batchnorm 层的均值和 var 替换为 model.train() 模式中的值。因此,两种模式的输出和参数都是相同的。 两个模式的两个模式参数的输出 然而,当我计算每个参数的梯度时,我发现BatchNorm层之前的层的梯度是不同的,尽管它们的参数和损失是相同的。 BatchNorm 之前层的不同梯度 我认为这是因为 model.train() 和 model.eval() 的 BatchNorm 层反向传播的差异,但我不了解它的细节。有人知道吗?太感谢了。

4

1 回答 1

0

当模式为 .train() 时,batchnorm 层计算输入的批量均值和方差,并使用它对输入进行归一化。此均值和方差也用于更新移动平均均值和方差。

当 mode 为 .eval() 时,batchnorm 层不计算输入的均值和方差,而是在训练阶段使用预先计算的移动平均均值和方差。

这样,当批次中的其他样本发生变化时,您的预测在测试期间不会在单个图像上发生变化。

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

在上面的代码中,运行均值和运行方差是在训练阶段计算的批范数层输入特征图的移动平均均值和方差。

于 2021-04-04T07:09:46.250 回答