【发布时间】:2020-05-19 10:12:01
【问题描述】:
我在 Keras 中实现了 Paper Edge-Connect (https://github.com/knazeri/edge-connect) 中提出的 GAN 模型,并在 KITTI 数据集上进行了一些培训。现在我正试图弄清楚我的模型内部发生了什么,因此我有几个问题。
1.初始训练(100 个 Epoch,500 个批次/批次,10 个样本/批次)
起初我按照论文中的建议训练模型(包括风格损失、感知损失、L1 损失和对抗损失)
乍一看,模型收敛到很好的结果:
这是生成器的输出(左)用于掩码输入(右)
张量板上的大多数图表看起来也相当不错: (这些都是来自 GAN-Model 的值,包含生成器的总损失(GENERATOR_Loss)、基于生成图像的不同损失(L1、perc、style)以及对抗性损失(DISCRIMINATOR_loss)
当仔细观察鉴别器时,情况会有所不同。生成图像的判别器的对抗性损失逐渐增加。 训练判别器时的损失(50/50 假/真示例)根本没有改变:
![] (https://i.stack.imgur.com/o5jCA.png)
当查看鉴别器输出的激活直方图时,它总是输出 0.5 左右的值。
提出我的问题/结论,希望得到您的反馈:
- 所以我现在假设,我的模型从鉴别器中学到了很多东西,但什么也没学到,对吧?结果都是基于其他的损失 比对抗性损失?
- 判别器似乎跟不上生成器生成更好图像的速度。我认为鉴别器激活应该以某种方式提前移动到大约 0(假标签)和 1(真实标签)的两个峰值并保持在那里?
- 我知道我的最终目标是判别器输出 0.5 的真假概率......但是如果这从一开始就发生并且在训练期间没有改变,这意味着什么?强>
- 我是否过早停止训练?判别器能否赶上(因为生成器的输出不再发生太大变化)并消除生成器最后的微小故障?
2. 于是我开始了第二次训练,这次只使用生成器中的对抗性损失! (~16 Epochs, 500 batches/epoch, 10 Samples/Batch)
这一次鉴别器似乎能够在一段时间后区分真假。 (prob_real 是分配给真实图像的平均概率,反之亦然) 激活的直方图看起来也不错:
但不知何故,在大约 4k 样本之后,事情开始发生变化,并且在大约 7k 时出现分歧...... 生成器中的所有样本也如下所示:
进入我的第二部分问题/结论:
- 我应该对鉴别器进行预训练以使其领先一步吗?我想它需要能够以某种方式区分真实和虚假(输出真实的大概率,反之亦然),以便生成器可以从中学习有用的东西?出于同样的原因,我是否应该在一步训练生成器的同时训练判别器多次?
- 第二次训练发生了什么?判别器的学习率是否太高?(选项:ADAM,lr=1.0E-3)
- 互联网上许多训练 GAN 的提示旨在增加鉴别器工作的难度(标签噪声/标签翻转、实例噪声、标签平滑等)。在这里我认为判别器需要提升?(->我也在不改变生成器的情况下训练了 Disc,它很好地收敛)
【问题讨论】:
-
您的图表的切片是什么?样本还是时期?
-
我更新了问题中的信息,切片是网络看到的批次
-
您的最后一张图片是mode collapse 的示例。为了绕过它,您可以重新开始训练或使用多个判别器,以防止生成器利用判别器中的漏洞“作弊”。
标签: machine-learning keras deep-learning generative-adversarial-network