【问题标题】:How to deal with batch normalization for multiple datasets?如何处理多个数据集的批量标准化?
【发布时间】:2021-10-27 00:07:36
【问题描述】:

我正在处理生成合成数据以帮助训练我的模型的任务。这意味着训练是在合成数据 + 真实数据上进行的,并在真实数据上进行测试。

有人告诉我,批量归一化层可能会在训练时试图找到对所有人都有好处的权重,这是一个问题,因为我的合成数据的分布并不完全等于真实数据的分布。因此,我们的想法是拥有批量标准化层权重的不同“副本”。使神经网络对合成数据和真实数据估计不同的权重,并仅使用真实数据的权重进行评估。

有人可以建议我在 pytorch 中实际实现它的好方法吗?我的想法如下,在数据集中的每个训练阶段之后,我都会遍历所有 batchnorm 层并保存它们的权重。然后在下一个纪元开始时,我将再次迭代加载正确的权重。这是一个好方法吗?不过,我不确定在测试时我应该如何处理批量规范权重,因为批量规范对它的处理方式不同。

【问题讨论】:

  • 到目前为止,您在实施方面做了哪些尝试?
  • 我刚刚尝试了其他方法。在构建模型时,我为每个训练数据集创建了 batchnorm 层的副本。然后我将数据集名称传递给 Forward 函数,并在每次运行时选择正确的层。但是我不确定这是否是一个好的程序并且会起作用

标签: python pytorch dataset conv-neural-network batch-normalization


【解决方案1】:

听起来您担心的问题是,当为一批真实数据和合成数据计算批范数时,您的神经网络将学习效果很好的权重,然后在测试时它会计算一个仅对真实数据进行批处理规范?

与其尝试跟踪多个批处理规范,您可能只想为您的批处理规范层设置track_running_statsTrue,然后在测试时将其置于评估模式。这将导致它在训练时计算多个批次的运行均值和方差,然后在稍后的测试时使用该均值和方差,而不是查看测试批次的批次统计信息。

(这通常是您想要的,因为根据您的用例,您可能会向部署的模型发送非常小的批次,因此您希望使用预先计算的均值和方差,而不是依赖于统计数据那些小批量。)

如果您真的想在测试时计算新的均值和方差,我会做的不是将包含真实数据和合成数据的单个批次传递到您的网络中,而是传递一批真实数据,然后是一批合成数据,并在反向传播之前将两个损失一起平均。 (请注意,如果您这样做不应该稍后依赖运行均值和方差 - 您必须将 track_running_stats 设置为 False,或者在完成后将其重置并运行几个只有真实数据的虚拟批次以计算合理的值。这是因为运行均值和方差统计仅在预期它们对于每个批次大致相同时才有用,而不是极化值通过在不同批次中输入不同类型的数据。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2018-04-09
    • 2013-07-27
    • 2017-10-21
    • 2016-11-13
    • 2017-03-03
    • 1970-01-01
    相关资源
    最近更新 更多