- Basic GAN
- 最基础的GAN网络,全部使用FC进行网络连接
- D网是[None, 784] -> [1] G网是[None, 100] -> [784] G网的input是随机生成的100个数字,output是通过G网后生成的784(28*28)的图片G_fake。loss为将G_fake送入D网得到的数字与label为1之间的差值 D网的input是G_fake和mnist中的图片D_real,output是一个评估是否为真实图片的数字。loss有两部分,第一部分G_fake生成的数字与label为0之间的差值,另一部分是D_real生成的数字与label为1之间的差值,两部分相加。
- D和G同时训练20000次,虽然开始出现数字的雏形,但是效果并不是太理想。
- DCGAN MNIST
- 引入了卷积运算,通过实验得出一套效果相对不错的模型
- D网[None, 64, 64, 1] -> [None, 32, 32, 128] -> [None, 16, 16, 256] -> [None, 8, 8, 512] -> [None, 4, 4, 1024] -> [None, 1, 1, 1] G网[None, 1, 1, 100] -> [None, 4, 4, 1024] -> [None, 8, 8, 512] -> [None, 16, 16, 256] -> [None, 32, 32, 128] -> [None, 64, 64, 1]
- 关键点:
- 每一层除了out层,都必须加上batch normalization.
- Loss函数与原始GAN一样.
- 使用lrelu效果会更好.
- 训练一次D网,训练两次G网效果会好一些.
- 缺点:
- 训练过程不稳定,很有可能D网的loss会降到特别小,而G网的loss上升,D网约束不了G网了。
- 有时候G网生成的图片多样性不足。
- 没有一个值衡量结果的好坏,Dloss与Gloss似乎要达到一种平衡才可以。
- 效果:
- WGAN
- WGAN 作者通过数学推导,证明了GAN的缺陷,然后针对缺陷进行了改进,网络模型基本不变
- 关键点:
- D网最后一层去掉sigmoid
- D网和G网的loss不取log
- 每次更新D网的参数后,把他们的绝对值截断到不超过一个固定常数c
- 不用Adam,用RMSProp或者SGD
- 优点就是明显网络稳定很多,相对DCGAN更容易收敛,一般不会出现GAN网D_loss降到特别小而无法约束G网的情况
- 缺点:对D网的参数范围进行限制后,很容易训练出D网的参数就集中在c值或者-c值上,而不是在-c到c之间,针对这点的改进就是WGAN-GP
- 效果:
- WGAN-GP
- 针对WGAN的D网训练出来的参数很容易集中在c值或者-c值上的缺点,而出现了WGAN-GP。取消了D网参数的截断,而对D网的loss增加了一个惩罚值
- 关键点:
- 对D网的loss增加了一个penalty的值 mix = real + epsilon*(fake-real) D_mix = discriminator(mix) grad = tf.gradients(D_mix, mix)[0] slopes = tf.sqrt(tf.reduce_sum(tf.square(grad), axis=[1, 2, 3])) penalty = tf.reduce_mean(tf.square(slopes - 1)) D_loss = D_loss_fake - D_loss_real + 10*penalty
- D网不使用batch normalization
- 调试下来,不使用bias效果会更好
- 迭代100多个epoch,有些动漫人物的脸部生成的效果很不错:
- pix2pix
- 跟上面的GAN算法开始有了差别,这个算法不再是从噪点生成图片了,而是通过图片生成图片,这样可以学习两个图片之间关联的风格,因为有A和B两类图片,所以在设计G网和D网时需要同时考虑两种图片进行训练
- D网的输入是将A和B两类图片concat后进行训练, [None, 256, 256, 3], [None, 256, 256, 3] -> [None, 256, 256, 6], 最后的output是[None, 30, 30, 1]
- G网是标准的UNET,用递归的方式实现是最合适的,因为在降维和升维过程中对应位置尺寸的数据还需要进行一次concat,input是[None, 256, 256, 3], output也是[None, 256, 256, 3]
- 这个网络可以做很多有趣的事情,可以做风格迁移的效果。比如涂色,通过线条画图等等。
- Loss就是普通的crossentropy,不过加了一个fake图片和realB的差值作为L1 loss。 L1 loss基本上可以比较清晰的衡量网络训练的效果。
- 用batchnorm就不用bias,不用batchnorm就用bias。
- CycleGAN
- CycleGAN网络结构和pix2pix基本一样,增加了一个反向的过程。 A -> B, B > A
- 网络有四个A->B的G网,B->A的G网,判定A的D网和判定B的D网
- A --(GA)--> fakeB --(GB)--> recA
- B --(GB)--> fakeA --(GA)--> recB
- A&&fakeA&&recA一起用DA进行判定,B&&fakeB&&recB用DB进行判定
- 这样前后互相约束生成的图片效果会比pix2pix好,而且A与B的图片并不需要是完全对应的图片。比如A1可以和B2进行对应,也可以和B3或者B4进行对应。
- 50个epoch的horse2zebra数据的效果,可以看到场景比较单一的情况下效果会好一些
- 100个epoch的monet2photo数据集的效果,前两张monet2photo,后两张photo2monet,monet生成photo的效果不如photo生成monet的效果。