GAN的loss函数的解读

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

参考1:GAN的Loss的比较研究(1)——传统GAN的Loss的理解1

参考2:若干常见GAN中的Loss及部分知识

你可能感兴趣的:(GAN的loss函数的解读)