【问题标题】:Why is tf.keras BatchNormalization causing GANs to produce nonsense loss and accuracy?为什么 tf.keras BatchNormalization 会导致 GAN 产生无意义的损失和准确性?
【发布时间】:2020-06-28 03:00:08
【问题描述】:

背景:

在使用 tf.keras 在鉴别器中使用批量归一化层训练 GAN 时,我得到了不寻常的损失和准确度。 GAN 具有 log(4) 的最佳目标函数值,当判别器完全无法区分真实样本和伪造样本时会发生这种情况,因此预测所有样本的值为 0.5。当我在判别器中包含 BatchNormalization 层时,生成器和判别器都能获得接近完美的分数(高精度、低损失),这在对抗性设置中是不可能的。

没有 BatchNorm:

This figure 显示不使用 BN 时每个 epoch (x) 的损失 (y)。请注意,偶尔低于理论最小值的值是由于训练是一个迭代过程。 This figure 显示了不使用 BN 时的准确度,每个都稳定在 50% 左右。这两个数字都显示了合理的值。

使用 BatchNorm:

This figure 显示使用 BN 时每个 epoch (x) 的损失 (y)。看看不应低于 log(4) 的 GAN 目标如何接近 0。This figure 显示了使用 BN 时的准确度,两者都接近 100%。 GAN 是对抗性的;生成器和判别器不可能都具有 100% 的准确率。

问题:

构建和训练 GAN 的代码可以在 here 找到。我是否遗漏了什么,我在实现中是否犯了错误,或者 tf.keras 中是否存在错误?我很确定这是一个技术问题,而不是“GAN-hacks”可以解决的理论问题。请注意,这仅涉及在鉴别器中使用 BatchNormalization 层;在生成器中使用它们不会导致此问题。

【问题讨论】:

    标签: python tensorflow keras batch-normalization generative-adversarial-network


    【解决方案1】:

    Tensorflow 的 BatchNormalization 层在 TF 2.0 和 2.1 中存在问题;降级到 TF 1.15 解决了这个问题。问题的原因尚未确定。

    这里是相关的 GitHub 问题:https://github.com/tensorflow/tensorflow/issues/37673

    【讨论】:

      【解决方案2】:

      问题的原因很简单。 Discriminator 学习区分 BatchNormalization 层的训练和测试阶段,而不是训练来区分数据。

      在训练阶段,BN 中使用实际批次均值和方差,而测试阶段使用存储在 BN 中的移动均值和移动方差。

      【讨论】:

        猜你喜欢
        • 2017-12-17
        • 2016-09-29
        • 1970-01-01
        • 1970-01-01
        • 2020-07-27
        • 2020-12-09
        • 1970-01-01
        • 2019-03-22
        • 2018-06-10
        相关资源
        最近更新 更多