了解生成对抗网络

SeV*_*eVe 6 machine-learning deep-learning keras generative-adversarial-network

我从Keras的 Paper Edge-Connect ( https://github.com/knazeri/edge-connect )实施了提议的 GAN 模型,并在 KITTI 数据集上进行了一些培训。现在我试图弄清楚我的模型内部发生了什么,因此我有几个问题。

1. 初始训练(100 Epochs,500 batches/epoch,10 Samples/Batch)

起初,我按照论文中的建议训练了模型(包括风格、感知、L1 和对抗性损失)

乍一看,该模型收敛到不错的结果:

文本 文本

这是屏蔽输入(右)的生成器(左)的输出

tensorboard 中的大部分图看起来也相当不错:(这些都是来自 GAN 模型的值,包含生成器的总损失(GENERATOR_Loss),基于生成的图像(L1,perc,style)的不同损失为以及对抗性损失(DISCRIMINATOR_loss)

当仔细观察鉴别器时,事情看起来就不一样了。生成图像的判别器的对抗性损失稳步增加。训练鉴别器时的损失(50/50 假/真例子)根本没有改变:

![] ( https://i.stack.imgur.com/o5jCA.png )

当查看鉴别器输出的激活直方图时,它总是输出大约 0.5 的值。

谈到我的问题/结论,我希望得到您的反馈:

  • 所以我现在假设,我的模型从鉴别器学到了很多,但没有学到什么,对吧?结果都是基于对抗性损失以外的损失?
  • 似乎鉴别器跟不上生成器生成更好的图像。我认为鉴别器激活应该以某种方式提前移动到 0(假标签)和 1(真实标签)附近的两个峰值并保持在那里?
  • 我知道我的最终目标是鉴别器输出 0.5 的真实概率和假概率……但是当这种情况从一开始就发生并且在训练期间没有改变时,这意味着什么?
  • 我是否过早停止训练?鉴别器能否赶上(因为发电机的输出不再有太大变化)并消除发电机的最后一个小故障?

2.于是我开始了第二次训练,这次只使用了生成器中的对抗性损失!(~16 个 Epoch,500 个批次/时期,10 个样本/批次)

这次鉴别器似乎能够在一段时间后区分真假。(prob_real 是分配给真实图像的平均概率,反之亦然)激活的直方图看起来也不错:

在此处输入图片说明

但是不知何故,在大约 4k 个样本之后,事情开始发生变化,并且在大约 7k 时它发散了……来自生成器的所有样本也如下所示:

在此处输入图片说明

来到我的问题/结论的第二部分:

  • 我是否应该预训练鉴别器以使其领先?我想它需要以某种方式能够区分真假(输出真实的大概率,反之亦然),以便生成器可以从中学习有用的东西?出于同样的原因,我应该在训练生成器一步的同时多次训练鉴别器吗?
  • 第二次训练发生了什么?鉴别器的学习率是否太高?(选项:ADAM,lr=1.0E-3)
  • 互联网上关于训练 GAN 的许多提示旨在增加鉴别器工作的难度(标签噪声/标签翻转、实例噪声、标签平滑等)。在这里,我认为鉴别器更需要提升?(-> 我还在不改变生成器的情况下训练了 Disc 并且它很好地收敛了)

小智 0

如果判别器在网络开始时直接输出 0.5 的概率,则意味着判别器的权重没有更新,并且在训练中不起作用,这进一步表明它无法区分来自生成器的真假图像。为了解决这个问题,尝试添加高斯噪声作为鉴别器的输入或进行标签平滑,这些都是非常简单而有效的技术。在回答你的这个问题时,结果都是基于除对抗性损失之外的损失,可以使用的技巧是尝试首先在除对抗性损失之外的所有损失上训练网络,然后对对抗性损失进行微调损失,希望有帮助。对于问题的第二部分,生成的图像似乎面临模式崩溃的问题,它们倾向于从 1 个图像学习颜色、退化并将其传递给其他图像,尝试通过减小批量大小来解决这个问题或使用展开的甘斯,