用各种GAN生成MNIST数字
数据获取
MNIST数据集的获取可以参考这篇博客:
https://blog.csdn.net/songbinxu/article/details/82992264
需要注意的是MNIST数据的值域范围,有的源是原本的
[0,255],有的归一化到了
[0,1]。
生成器和判别器
实现了CNN和MLP两种版本。CNN结构参考自这里,MLP结构参考自这里。
有关 Spectral Norm
在dense
层、conv2d
层和deconv2d
层中都实现了Spectral Normalization,可以自由选择或取消。Spectral Normalization是用来限制判别器D的,不应该加到生成器G中。
有关 Gradient Clipping
所谓 Gradient Clipping(GC) 就是将参数限制在某个范围内,比如
(−0.01,0.01),它也是用来限制判别器D的,不应该加到生成器G中。WGAN的原始版本必须加GC,以保证判别器D满足Lipschiz连续条件。我的经验是,即使是其他GAN类型,有时候加上GC也有奇效,比如在LSGAN里,没有加GC时是无法生成MNIST的,加上之后就好了。
各种GAN的目标函数
目前涉及到的有GAN、WGAN、WGAN-GP、DRAGAN、LSGAN和CGAN。
以后有空再补其他的。
GAN
LD=E[log(D(x))]+E[log(1−D(G(z))]LG=E[log(D(G(z)))](1)
WGAN
LD=E[D(x)]−E[D(G(z))]LG=E[D(G(z))]WD←clip(WD,−0.1,0.1)(2)
WGAN-GP
LD=LDWGAN+λE[(∣▽D(αx−(1−αG(z)))∣−1)2]LG=LGWGAN(3)
LSGAN
LD=E[(D(x)−1)2]+E[D(G(z)2]LG=E[(D(G(z))−1)2](4)
DRAGAN
LD=LDGAN+λE[(∣▽D(αx−(1−αxp))∣−1)2]LG=LGGAN(5)
CGAN
LD=E[log(D(x,c))]+E[log(1−D(G(z),c)]LG=E[log(D(G(z),c))](6)
生成效果
完整代码
https://github.com/SongDark/GAN_collections