GAN 中的损失函数
Loss functions in GANs
我正在尝试构建一个简单的 mnist GAN,不用多说,它没有用。我搜索了很多并修复了我的大部分代码。虽然我不能真正理解损失函数是如何工作的。
这是我所做的:
loss_d = -tf.reduce_mean(tf.log(discriminator(real_data))) # maximise
loss_g = -tf.reduce_mean(tf.log(discriminator(generator(noise_input), trainable = False))) # maxmize cuz d(g) instead of 1 - d(g)
loss = loss_d + loss_g
train_d = tf.train.AdamOptimizer(learning_rate).minimize(loss_d)
train_g = tf.train.AdamOptimizer(learning_rate).minimize(loss_g)
我得到 -0.0 作为我的损失值。你能解释一下如何处理 GAN 中的损失函数吗?
看来你试图将生成器和判别器的损失加在一起,这是完全错误的!
由于鉴别器同时使用真实数据和生成的数据进行训练,因此您必须创建两种不同的损失,一种用于真实数据,另一种用于传递给鉴别器网络的噪声数据(生成的)。
尝试按如下方式更改您的代码:
1)
loss_d_real = -tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=discriminator(real_data),labels= tf.ones_like(discriminator(real_data))))
2)
loss_d_fake=-tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=discriminator(noise_input),labels= tf.zeros_like(discriminator(real_data))))
那么鉴别器损失将等于=loss_d_real+loss_d_fake。
现在为您的生成器创建损失:
3)
loss_g= tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=discriminator(genereted_samples), labels=tf.ones_like(genereted_samples)))
Maryam 似乎已经确定了你的虚假损失值的原因(即生成器和鉴别器损失的总和)。只是想补充一点,您可能应该为鉴别器选择随机梯度下降优化器来代替 Adam - 这样做可以在玩极小极大游戏时为网络收敛提供更强的理论保证(来源:https://github.com/soumith/ganhacks)。
我正在尝试构建一个简单的 mnist GAN,不用多说,它没有用。我搜索了很多并修复了我的大部分代码。虽然我不能真正理解损失函数是如何工作的。
这是我所做的:
loss_d = -tf.reduce_mean(tf.log(discriminator(real_data))) # maximise
loss_g = -tf.reduce_mean(tf.log(discriminator(generator(noise_input), trainable = False))) # maxmize cuz d(g) instead of 1 - d(g)
loss = loss_d + loss_g
train_d = tf.train.AdamOptimizer(learning_rate).minimize(loss_d)
train_g = tf.train.AdamOptimizer(learning_rate).minimize(loss_g)
我得到 -0.0 作为我的损失值。你能解释一下如何处理 GAN 中的损失函数吗?
看来你试图将生成器和判别器的损失加在一起,这是完全错误的! 由于鉴别器同时使用真实数据和生成的数据进行训练,因此您必须创建两种不同的损失,一种用于真实数据,另一种用于传递给鉴别器网络的噪声数据(生成的)。
尝试按如下方式更改您的代码:
1)
loss_d_real = -tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=discriminator(real_data),labels= tf.ones_like(discriminator(real_data))))
2)
loss_d_fake=-tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=discriminator(noise_input),labels= tf.zeros_like(discriminator(real_data))))
那么鉴别器损失将等于=loss_d_real+loss_d_fake。 现在为您的生成器创建损失:
3)
loss_g= tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=discriminator(genereted_samples), labels=tf.ones_like(genereted_samples)))
Maryam 似乎已经确定了你的虚假损失值的原因(即生成器和鉴别器损失的总和)。只是想补充一点,您可能应该为鉴别器选择随机梯度下降优化器来代替 Adam - 这样做可以在玩极小极大游戏时为网络收敛提供更强的理论保证(来源:https://github.com/soumith/ganhacks)。