Pig*_*hou 7 python machine-learning neural-network keras generative-adversarial-network
我目前正在用(大约)Wasserstein 损失在 keras 中训练 WGAN,如下所示:
def wasserstein_loss(y_true, y_pred):
return K.mean(y_true * y_pred)
Run Code Online (Sandbox Code Playgroud)
但是,这种损失显然可能是负数,这对我来说很奇怪。
我对 WGAN 进行了 200 个 epoch 的训练,得到了下面的评论家 Wasserstein 损失训练曲线。

上述损失计算为
d_loss_valid = critic.train_on_batch(real, np.ones((batch_size, 1)))
d_loss_fake = critic.train_on_batch(fake, -np.ones((batch_size, 1)))
d_loss, _ = 0.5*np.add(d_loss_valid, d_loss_fake)
Run Code Online (Sandbox Code Playgroud)
结果生成的样本质量很好,所以我认为我正确地训练了 WGAN。但是我仍然无法理解为什么 Wasserstein 损失可能为负并且模型仍然有效。根据原始WGAN论文,Wasserstein loss可以作为GAN的性能指标,那么我们应该如何解释呢?我有什么误解吗?
小智 5
Wasserstein 损失是地球运动距离的度量,它是两个概率分布之间的差异。在 tensorflow 中,d_loss = tf.reduce_mean(d_fake) - tf.reduce_mean(d_real)如果d_fake在d_real分布的另一侧移动得太远,它显然可以给出负数。你可以在你的图中看到它,在训练过程中你的真实和虚假分布改变边,直到它们收敛到零附近。因此,作为性能测量,您可以使用它来查看生成器与真实数据的距离以及它现在位于哪一侧。
查看分布图:
PS这是交叉熵损失,而不是Wasserstein。如果你还没有阅读这篇文章,也许这篇文章可以帮助你更多。然而,另一个问题是优化器如何最小化负损失(为零)。
| 归档时间: |
|
| 查看次数: |
4729 次 |
| 最近记录: |