GAN的目標(biāo)是
這里的LOSS為
先訓(xùn)練D,再訓(xùn)練G,
以D為 變量使得loss最大化,同時也是對優(yōu)化
但是只能求解最小,因此要變成
在代碼里表現(xiàn)為 cross_entropy,其公式最前面有負(fù)號,如下
def discriminator_loss(disc_fake, disc_real):
#輸入是真假圖片的辨別結(jié)果,fake是把假圖片看成什么,real是把真圖片看成什么,
#是把假圖片看成假,真圖片看成真的能力,與實(shí)際誤差越小越好
#平均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)))
#結(jié)果是用來對discr求解
return disc_loss_real + disc_loss_fake
然后再對G進(jìn)行優(yōu)化,即是對優(yōu)化
目標(biāo)是使得D(z)越大越好,log(D)與D單調(diào)性相同,也就是使得log(D)越大越好,代碼中要求最小,也就是-log(D)
也就是生成讓D判別為真的能力,也就是D與1的交叉熵
在代碼里表現(xiàn)為
def generator_loss(reconstructed_image):
#輸入是假圖片是真假圖片的 二維值,未經(jīng)過cross entropy
#識別出重構(gòu)圖片的能力,輸入是D 對重構(gòu)圖片的辨別結(jié)果,D的目標(biāo)是讓這個結(jié)果越大越好
#為了迷惑判別器,我們給他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)——傳統(tǒng)GAN的Loss的理解1
參考2:若干常見GAN中的Loss及部分知識