用于域翻译的条件 GAN

Jos*_*mon 5 python keras generative-adversarial-network

我正在训练一个 GAN 从两个不同的图像域(源S和目标T)执行样式转换。因为我有可用的类信息,所以我有一个额外的Q网络(除了GD),它测量目标域及其标签(LeNet 网络)的生成图像的分类结果,并将错误传播到生成器以及D. 从系统的收敛性我注意到它D总是从 8(网络的损失函数误差D)开始并略微下降到 4.5,并且G损失函数误差从 1 开始并迅速下降到 0.2。的损失函数DG我使用的,可以发现在这里,而丧失功能Q网络是分类交叉熵。迭代中的误差图是:

在此处输入图片说明

D和G的损失函数为:

def discriminator_loss(y_true,y_pred):
      BATCH_SIZE=10
      return K.mean(K.binary_crossentropy(K.flatten(y_pred), K.concatenate([K.ones_like(K.flatten(y_pred[:BATCH_SIZE,:,:,:])),K.zeros_like(K.flatten(y_pred[:BATCH_SIZE,:,:,:])) ]) ), axis=-1)

def discriminator_on_generator_loss(y_true,y_pred):
     BATCH_SIZE=10
     return K.mean(K.binary_crossentropy(K.flatten(y_pred), K.ones_like(K.flatten(y_pred))), axis=-1)

def generator_l1_loss(y_true,y_pred):
     BATCH_SIZE=10
     return K.mean(K.abs(K.flatten(y_pred) - K.flatten(y_true)), axis=-1)
Run Code Online (Sandbox Code Playgroud)

D 的误差函数总是那么高有意义吗?什么是错误的解释DG?是不是开始时的损失D应该很小,迭代后会上升?用损失阈值限制D过度是个好主意G吗?最后,在训练期间计算来自验证集的损失函数而不是我正在使用的训练集的误差是否有意义?(而不是直接使用 train_on_batch 使用 fit 然后在测试集上进行评估)。

编辑:

对于损失,我认为损失discriminatordiscriminator_on_generator是 GAN 的正常损失函数,对吗?

say*_*yan 0

设 G 为生成器,D 为判别器。最初,D 和 G 都未经训练。现在,我们假设 D 的学习速度比 G 快。因此,一段时间后,G 可以区分从真实数据分布中采样的样本和从生成器中采样的样本。最后,G 赶上了并学会模拟真实的数据分布。现在,D 无法再区分从真实数据分布中采样的样本和从生成器中采样的样本。

综合 GD 损失

因此,我们最初从 D 和 G(区域 I)的高损失开始。那么 D 的损失比 G 的损失下降得更快(区域 I 到 II)。随着 G 的损失持续减少,D 的损失增加(区域 II)。最后,两个损失都达到平衡值,训练由此完成(区域 III)。

D损失 重力损失