初识GAN

旧街凉风 提交于 2020-01-16 21:58:02

传统GAN

判别器loss

d_loss = d_loss_real + d_loss_fake

d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_real, labels=tf.ones_like(d_logits_real) * (1 - smooth)))

d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_fake, labels=tf.zeros_like(d_logits_fake)))

生成器loss

g_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_fake, labels=tf.ones_like(d_logits_fake)))

训练技巧

在GAN训练的过程中,为更好地泛化,一般会使用smooth参数将real的标签设为略小于1的值,如0.9(为了增强判别器discriminator的泛化能力,可以将labels设为0.9,而不是1.0);而对于生成器生成的fake,输入判别器的标签设为0.

WGAN

判别器

D_real = netD(inputPostive)
D_fake = netD(inputNegative)
D_loss = -D_real + D_fake
ExPg[fw(x)]ExPr[fw(x)]\mathbb{E}_{x \sim P_{g}}\left[f_{w}(x)\right]-\mathbb{E}_{x \sim P_{r}}\left[f_{w}(x)\right]

生成器

G_loss = -netD(inputNegative)
ExPg[fw(x)]-\mathbb{E}_{x \sim P_{g}}\left[f_{w}(x)\right]

训练技巧

训练次数

一般来说,Discrimnator要训练的比Genenrator多:比如训练五次Discrimnator,再训练一次Genenrator。

判别器学习率

判别器学习速率不能过大,一般要比Genenrator的速率小一点。

优化器

Optimizer的选择不能用基于动量法的,如Adam和momentum。
可使用RMSProp或者SGD。

其他

判别器最后一层去掉sigmoid
生成器和判别器的loss不取log
每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行

LSGAN----Least Squares GANs

判别器

minDJ(D)=minD12ExPr[D(x)a]2+12EzPz[D(G(z))b]2\min _{D} J(D)=\min _{D} \frac{1}{2} E_{x \sim P_{r}}[D(x)-a]^{2}+\frac{1}{2} E_{z \sim P_{z}}[D(G(z))-b]^{2}

生成器

minGJ(G)=minG12EzPz[D(G(z))c)]2\left.\min _{G} J(G)=\min _{G} \frac{1}{2} E_{z \sim P_{z}}[D(G(z))-c)\right]^{2}

设置

常数a、b分别表示真实图片和生成图片的标记;c是生成器为了让判别器认为生成图片是真实数据而定的值。
作者设置a=c=1,b=0。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!