neural-network - 如何解释生成对抗网络中判别器的损失和生成器的损失?

标签 neural-network deep-learning generative-adversarial-network

我正在阅读人们对 DCGAN 的实现,尤其是 this one在 tensorflow 中。

在该实现中,作者绘制了鉴别器和生成器的损失,如下所示(图片来自 https://github.com/carpedm20/DCGAN-tensorflow):

enter image description here

enter image description here

鉴别器和生成器的损失似乎都没有遵循任何模式。不同于一般的神经网络,其损失随着训练迭代次数的增加而减少。训练 GAN 时如何解释损失?

最佳答案

不幸的是,就像你对 GAN 所说的那样,损失非常不直观。大多数情况下,这是因为生成器和鉴别器相互竞争,因此一个的改进意味着另一个的损失更高,直到另一个在接收到的损失上学习得更好,这搞砸了它的竞争对手,等等。

现在应该经常发生的一件事(取决于您的数据和初始化)是鉴别器和生成器损失都收敛到一些永久数字,如下所示:

(损失稍微反弹是可以的 - 这只是模型试图改进自身的证据)

这种损失收敛通常意味着 GAN 模型找到了一些最优解,在那里它不能改进更多,这也应该意味着它已经学得足够好。 (另请注意,数字本身通常提供的信息并不多。)

以下是一些小贴士,希望对大家有所帮助:

  • 如果损失没有很好地收敛,这并不一定意味着模型没有学到任何东西——检查生成的例子,有时它们已经足够好了。或者,可以尝试更改学习率和其他参数。
  • 如果模型收敛良好,仍然检查生成的示例 - 有时生成器会发现一个/几个判别器无法与真实数据区分开的示例。问题是它总是给出这几个,而不是创造任何新的东西,这被称为模式崩溃。通常为您的数据引入一些多样性会有所帮助。
  • 由于 Vanilla GAN 相当不稳定,我建议使用 some version of the DCGAN models ,因为它们包含一些特征,如卷积
    层和批量标准化,这应该有助于
    收敛的稳定性。 (上图是 DCGAN 的结果,而不是 vanilla GAN)
  • 这是一些常识,但仍然是:就像大多数神经网络结构调整模型一样,即更改其参数或/和架构以满足您的某些需求/数据可以改进模型或搞砸它。
  • 关于neural-network - 如何解释生成对抗网络中判别器的损失和生成器的损失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42690721/

    相关文章:

    machine-learning - 定时从Google Colab下载

    TensorFlow:nr。时代与天然橡胶。训练步骤

    machine-learning - Python/Keras/Theano 深度自动编码器的错误维度

    java - 无法将 ND4j 遮蔽到 jar 中

    python-3.x - 在使用 train_on_batch() 训练的 Keras 中重新训练保存的模型

    tensorflow2.0 - 从检查点加载模型失败?

    conv-neural-network - 生成图像上的白点 CycleGAN

    machine-learning - 什么是循环神经网络,什么是长短期内存 (LSTM) 网络,它总是更好吗?

    python - 使用 Tensorflow CNN 分类器获取精度和召回值

    neural-network - 3D 坐标作为神经网络的输出