GAN的目标是
这里的LOSS为
先训练D,再训练G,
以D为 变量使得loss最大化,同时也是对优化
但是只能求解最小,因此要变成
在代码里表现为 cross_entropy,其公式最前面有负号,如下
def discriminator_loss(disc_fake, disc_real):
#输入是真假图片的辨别结果,fake是把假图片看成什么,real是把真图片看成什么,
#是把假图片看成假,真图片看成真的能力,与实际误差越小越好
#平均loss
disc_loss_real = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
logits=disc_real, labels=tf.ones([batch_size], dtype=tf.int32)))
disc_loss_fake = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
logits=disc_fake, labels=tf.zeros([batch_size], dtype=tf.int32)))
#结果是用来对discr求解
return disc_loss_real + disc_loss_fake
然后再对G进行优化,即是对优化
目标是使得D(z)越大越好,log(D)与D单调性相同,也就是使得log(D)越大越好,代码中要求最小,也就是-log(D)
也就是生成让D判别为真的能力,也就是D与1的交叉熵
在代码里表现为
def generator_loss(reconstructed_image):
#输入是假图片是真假图片的 二维值,未经过cross entropy
#识别出重构图片的能力,输入是D 对重构图片的辨别结果,D的目标是让这个结果越大越好
#为了迷惑判别器,我们给他1,gen_loss越大越好,但是opti都是求最小化
gen_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
logits=reconstructed_image, labels=tf.ones([batch_size], dtype=tf.int32)))
return gen_loss