【问题标题】:Questions about Batch Normalization in Pytorch [closed]关于 Pytorch 中的批量标准化的问题 [关闭]
【发布时间】:2020-12-27 04:26:39
【问题描述】:

最近在PyTorch中使用BN,有几个问题。

  1. 基于 PyTorch 中的 BN2d 文档,在推理(评估)时,它将自动使用 BN 层的均值和方差(训练时的运行估计)。但是,我的第一个问题是,当我们在训练后保存模型时,它是否包含运行均值和方差?我原本以为模型只会保存可学习的参数。但是运行均值和方差不是真的可以学习的吗?
  2. 默认情况下,当我们在 PyTorch 中使用 eval() 时,BN 层将使用来自特定变量(可能是训练结果)的一些运行均值和方差,对吧?但不计算小批量的均值和方差? (因为我看到一些答案提到BN在推理时的糟糕表现是由1-size的batch造成的。但它应该使用训练的running mean和variance,为什么测试的batch size会影响?
  3. 第三个问题与第二个问题有点相关。 BN 在推理时会执行相同的操作吗?例如,当我迭代测试集两次时。结果会有不同的表现吗? (也许更直接的问题是,在推理时均值和方差会发生变化吗?)
  4. 我还想知道是否可以使用小批量均值和方差或运行均值和方差进行推理。如果我只设置 BN 层进行训练,它的可学习参数也会更新。但也许我只是希望他们获得新的均值和方差。有没有办法做到这一点?
  5. 最后一个问题与第四个问题有关。那么使用所有测试数据或一批测试数据的均值和方差来计算均值和方差是否公平?我的意思是公平的是,使用测试集的某些属性是否不合适(棘手?)?

期待您的回答。我是一种新鸟,愿意和你一起学习讨论!!

提前致谢!!!

【问题讨论】:

    标签: python tensorflow pytorch batch-normalization


    【解决方案1】:

    我从高年级同学那里得到答案,我认为这对其他人有用。 (如有不同意见,欢迎评论)

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

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

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

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

    5. 这是一些技巧。我听说一些 GAN 论文对 BN 层采用了这种策略。

    【讨论】:

    • 您好,对于 Q5,您能提供更多信息吗?像GAN论文相关的吗?
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2011-06-10
    • 2019-06-09
    • 2019-05-11
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    相关资源
    最近更新 更多