我无法理解TensorFlow文档中GAN模型的损失函数。为什么对真实损失使用tf.ones_like()
,而对伪造输出使用tf.zeros_like()
?
def discriminator_loss(real_output,fake_output): real_loss = cross_entropy(tf.ones_like(real_output),real_output) fake_loss = cross_entropy(tf.zeros_like(fake_output),fake_output) total_loss = real_loss + fake_loss return total_loss
回答:
我们需要以最小-最大(或你喜欢称之为min-max)的方式最小化以下损失函数。
- 生成器损失 = -log(生成标签)
- 判别器损失 = -log(真实标签) – log(1 – 生成标签)
其中real_output
= 真实标签,fake_output
= 生成标签。
现在,考虑到这一点,让我们看看TensorFlow文档中的代码片段代表什么:
real_loss = cross_entropy(tf.ones_like(real_output), real_output)
计算结果为- real_loss = -1 * log(real_output) – (1 – 1) * log(1 – real_output) = -log(real_output)
fake_loss = cross_entropy(tf.zeros_like(fake_output),fake_output)
计算结果为- fake_loss = -0 * log(fake_output) – (1 – 0) * log(1 – fake_output) = -log(1 – fake_output)
total_loss = real_loss + fake_loss
计算结果为- total_loss = -log(real_output) – log(1 – fake_output)
显然,我们得到了在最小-最大博弈中希望最小化的判别器损失函数。