GAN中的判别器如何“判别”

简介在GAN中,判别器用来判断生成器生成的样本是真的还是假的,类似于图像的二分类。在训练时,它不是直接输出一张图像是1还是0,而是将输出结果融入损失函数进行统一计算。参考链接,进行说明。 判别器基本构成是卷积+全连接层+密集连接层。训练时,对于每张假的(来自生成器)图像通过判别器得到判别信息,再将对应的真实图像通过判别器得到判别信息。可得到两个方面的损失函数 (代码来自参考链接) with tf.variable_scope('discriminator_loss'): di

在GAN中,判别器用来判断生成器生成的样本是真的还是假的,类似于图像的二分类。在训练时,它不是直接输出一张图像是1还是0,而是将输出结果融入损失函数进行统一计算。参考链接,进行说明。


判别器基本构成是卷积+全连接层+密集连接层。训练时,对于每张假的(来自生成器)图像通过判别器得到判别信息,再将对应的真实图像通过判别器得到判别信息。可得到两个方面的损失函数

(代码来自参考链接)

with tf.variable_scope('discriminator_loss'): discrim_fake_loss = tf.log(1 - discrim_fake_output + FLAGS.EPS) discrim_real_loss = tf.log(discrim_real_output + FLAGS.EPS) discrim_loss = tf.reduce_mean(-(discrim_fake_loss + discrim_real_loss))

判别器损失:作者在discrim_fake_loss和discrim_real_loss中用了log函数,而判别器输出的数在0-1之间,因此这两个log的结果就是负的,因此越大(负得越少)越好,越大,第三行的discrim_loss就越小。discrim_fake_output是判别假图片输出的信息,如果每次输出都为0,那么判别器性能最好。如果discrim_fake_output每次输出结果都为1,那么判别器性能最好。

with tf.variable_scope('adversarial_loss'): adversarial_loss = tf.reduce_mean(-tf.log(discrim_fake_output + FLAGS.EPS))

对抗损失,就是判别器在判别假图片时,它主观上希望的损失,它希望输出都是0,越靠近0,-log就越大。因此这个损失函数在训练时应该是上升的曲线。

这两种由判别器结果计算的损失函数,在训练时可选择性地使用,如,生成器的损失可以和对抗损失结合。训练时,每次需分别更新生成器的损失和判别器的损失。两者性能都达到最优时,用生成器生成的图片和Ground Truth就最为接近。

本文转自:https://blog.csdn.net/m0_37820219/article/details/105890818
新加评论 评论标题: