Python 关于Pytorch中批处理规范化的问题

Python 关于Pytorch中批处理规范化的问题,python,tensorflow,pytorch,batch-normalization,Python,Tensorflow,Pytorch,Batch Normalization,最近,当我在PyTorch中使用BN时,我有几个问题 根据PyTorch中的BN2d文档,在推断(评估)时,它将自动使用BN层的均值和方差(训练时运行估计)。然而,我的第一个问题是,当我们在训练后保存模型时,它是否包含运行均值和方差?我原本以为模型只会保存可学习的参数。但是运行的均值和方差不是真正可以学习的吗? 默认情况下,当我们在PyTorch中使用eval()时,BN层将使用特定变量的一些运行平均值和方差(可能是训练的结果),对吗?但不计算小批量的均值和方差?(因为我看到一些答案提到,在1

最近,当我在PyTorch中使用BN时,我有几个问题

  • 根据PyTorch中的BN2d文档,在推断(评估)时,它将自动使用BN层的均值和方差(训练时运行估计)。然而,我的第一个问题是,当我们在训练后保存模型时,它是否包含运行均值和方差?我原本以为模型只会保存可学习的参数。但是运行的均值和方差不是真正可以学习的吗?
  • 默认情况下,当我们在PyTorch中使用eval()时,BN层将使用特定变量的一些运行平均值和方差(可能是训练的结果),对吗?但不计算小批量的均值和方差?(因为我看到一些答案提到,在1号批次的情况下,BN在推断时表现不佳。但它应该使用训练的运行平均值和方差,为什么测试的批次大小会产生影响
  • 第三个问题与第二个问题有点相关。BN在推断时的表现是否相同。例如,当我重复测试集两次时,结果是否会有所不同?(可能更直接的问题是,在推断时均值和方差是否会变化?)
  • 我还想知道是否可以使用小批量均值和方差或运行均值和方差进行推断。如果我只将BN层设置为训练,其可学习参数也将更新。但也许我只是想让他们获得新的均值和方差。有没有可能的方法做到这一点
  • 最后一个问题与第四个问题有关。那么,使用所有测试数据的均值和方差,或者使用一批测试数据来计算均值和方差是否公平?我的意思是公平,即使用测试集的某些属性是否不合适(棘手?)
  • 期待你的回答。我是一种新的鸟,愿意与你学习和讨论


    提前感谢!!!

    我从我的高年级同学那里得到了答案,我认为这对其他人很有用。(如果你有不同的观点,请随意评论)

  • 当我们保存整个模型时,它将包含BN层的运行均值和方差。这两个参数是不可学习的(在向后过程中不更新,但在向前过程中更新)

  • 如果使用.eval(),则BN层将自动使用存储在该层中的运行平均值和方差,并且不会在正向过程中再次更新。这意味着在推断时,BN层将使用在训练过程中计算的运行平均值和方差

  • 是的,如果只使用.eval(),BN层将始终使用相同的平均值和方差

  • 可以根据测试集计算运行均值和方差。只需将BN层设置为train()模式。这不会影响BN层的可学习参数。因为在推断时,我们只有一个正向过程(更新均值和方差)如果我们必须在评估或推断期开始时重置均值和方差,使均值和方差与训练过程完全无关,则可能没有反向过程

  • 这有点诡计。我听说一些GAN报纸对BN层采用了这样的策略


  • 嗨,关于Q5,你能提供一些更多的信息吗?比如GAN文件?