【发布时间】: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