python - Wasserstein 损失可以是负数吗?

标签 python machine-learning keras neural-network generative-adversarial-network

我目前正在使用(大约)Wasserstein 损失在 keras 中训练 WGAN,如下所示:

def wasserstein_loss(y_true, y_pred):
    return K.mean(y_true * y_pred)

然而,这种损失显然可以是负数,这让我很奇怪。

我对 WGAN 进行了 200 个 epoch 的训练,得到了下面的 critic Wasserstein 损失训练曲线。 Wasserstein loss training curve

以上loss计算方式

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)

生成的样本质量很好,所以我认为我正确地训练了 WGAN。但是,我仍然不明白为什么 Wasserstein 损失可能为负而模型仍然有效。根据 WGAN 原论文,Wasserstein loss 可以作为 GAN 的性能指标,那么我们应该如何解读呢?我是不是误解了什么?

最佳答案

Wasserstein 损失是地球运动距离的度量,它是两个概率分布之间的差异。在 tensorflow 中,它被实现为 d_loss = tf.reduce_mean(d_fake) - tf.reduce_mean(d_real) 如果 d_fake 在另一个方面移动得太远,它显然会给出一个负数d_real 分布的一侧。您可以在您的情节中看到它,在训练过程中,您的真实分布和虚假分布会改变边,直到它们收敛于零附近。因此,作为性能测量,您可以使用它来查看生成器与真实数据的距离以及它现在位于哪一侧。

查看分布图:

enter image description here

附言这是交叉熵损失,而不是 Wasserstein。 也许this article如果您还没有阅读它,可以为您提供更多帮助。然而,另一个问题是优化器如何将负损失最小化(至零)。

关于python - Wasserstein 损失可以是负数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57104606/

相关文章:

python - 获取或检查 Jinja2 中的当前环境

python - python中的引用问题

python - 字符串索引超出范围,维吉尼亚密码

python - 如何将数组列表转换为单个多维 numpy 数组?

python - 使用tensorflow和TFBertForNextSentencePrediction在特定语料库上进一步训练bert

python - 在 for 循环中创建一个新的顺序模型(使用 Keras)

tensorflow - 卷积的维数?

machine-learning - K表示多维数据的聚类

python - Tensorflow ImageDataGenerator错误关闭:“图像”对象没有属性“fp”

python - 拟合神经网络时出现 UnboundLocalError - TensorFlow 错误?