GAN的基本原理
G(Generator)和D(Discriminator)。
如果是生成图片->
G是一个生成图片的网络,它接收一个随机的噪声z,通过这个噪声生成图片,记做G(z)。
D是一个判别网络,判别一张图片是不是“真实的”。它的输入参数是x,x代表一张图片,输出D(x)代表x为真实图片的概率,如果为1,就代表100%是真实的图片,而输出为0,就代表不可能是真实的图片。
过程就如下:
生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而D的目标就是尽量把G生成的图片和真实的图片分别开来。这样,G和D构成了一个动态的“博弈过程”。
在最理想的状态下,G可以生成足以“以假乱真”的图片G(z)。对于D来说,它难以判定G生成的图片究竟是不是真实的,因此D(G(z)) = 0.5。
CycleGAN的原理
论文地址:https://arxiv.org/abs/1703.10593
CycleGAN的原理:将一类图片转换成另一类图片。
也就是说,现在有两个样本空间,X和Y,我们希望把X空间中的样本转换成Y空间中的样本。
实际的目标就是学习从X到Y的映射。我们设这个映射为F。它就对应着GAN中的生成器,F可以将X中的图片x转换为Y中的图片F(x)。对于生成的图片,我们还需要GAN中的判别器来判别它是否为真实图片,由此构成对抗生成网络。设这个判别器为 D_{Y}
这里会出现所有的X映射到一个Y,损失就会没有意义了。
再假设一个映射G,它可以将Y空间中的图片y转换为X中的图片G(y)。CycleGAN同时学习F和G两个映射,并要求 F(G(y)) \approx y ,以及 G(F(x)) \approx x 。也就是说,将X的图片转换到Y空间后,应该还可以转换回来。这样就杜绝模型把所有X的图片都转换为Y空间中的同一张图片了。
为G也引入一个判别器 D_{X} ,由此可以同样定义一个GAN的损失
最后的损失就会是这样三个和在一起
pix2pix也可以做图像变换,它和CycleGAN的区别在于,pix2pix模型必须要求成对数据(paired data),而CycleGAN利用非成对数据也能进行训练(unpaired data)。
这里用橘子案例来实战跑一下。
地址:https://github.com/vanhuyz/CycleGAN-TensorFlow
这里只跑两轮。
可以看到几乎不起作用,训练太少了,没有很好的拟合。
所以最后测试苹果转橘子的效果很差
然后这里用训练好的模型导入再看一次
明显要比上面清晰好多。
参考地址:https://zhuanlan.zhihu.com/p/28342644