传统GAN的原理已经了解,写博客还是为了学习新东西,cycleGAN网上已经有了很多介绍,这里也是参考别人写的东西,自己再学习了解。
cycleGAN个人感觉主要可以用于风格迁移,可以用来处理图像转换过程中数据unpair的问题。其本质是两个对称的GAN,构成一个环形网络。两个GAN共享两个生成器,并各自带一个判别器,即总共两个判别器和两个生成器。其基于的原理是,一个A类型的图片,经过两次变换,可以变回自己,B类型亦然。表示如下:
GB2A(GA2B(x))=x G B 2 A ( G A 2 B ( x ) ) = x
GA2B(GB2A(y))=y G A 2 B ( G B 2 A ( y ) ) = y
cycleGAN的模型结构如下所示:
介绍一下损失函数,对于生成网络x到y及其判别网络,目标函数为:
LGAN(G,DY,X,Y)=Ey−Pdata(y)[logDY(y)]+Ex−Pdata(x)[log(1−DY(G(x))] L G A N ( G , D Y , X , Y ) = E y − P d a t a ( y ) [ l o g D Y ( y ) ] + E x − P d a t a ( x ) [ l o g ( 1 − D Y ( G ( x ) ) ]
该公式的目的是为了让生成网络生成图像Y,和真实的Y尽可能相似。同理也可以构建生成网络y-x,及其判别网络的目标函数。
上述损失函数其实和一般的GAN的损失函数没有什么区别,而单纯使用这个损失函数是没有办法进行训练的,因为由于训练数据是unpair的,所以映射G完全可以将所有的x都映射成y,从而使损失无效。因此这里提出了循环一致性损失,要求F和G两个映射可以分别将y和x变回去,即
F(G(x))=x F ( G ( x ) ) = x 和
G(F(y))=y G ( F ( y ) ) = y ,循环一致性损失定义如下:
Lcyc(F,G,X,Y)=Ex−Pdata(x)[||F(G(x))−x||1]+Ey−Pdata(y)[||G(F(y)−y||1] L c y c ( F , G , X , Y ) = E x − P d a t a ( x ) [ | | F ( G ( x ) ) − x | | 1 ] + E y − P d a t a ( y ) [ | | G ( F ( y ) − y | | 1 ]
最终的损失函数综合了G和F的GAN损失和循环一致性损失,如下所示:
Ltotal=LGAN(F,DY,X,Y)+LGAN(G,DX,X,Y)+λLcyc(F,G,X,Y) L t o t a l = L G A N ( F , D Y , X , Y ) + L G A N ( G , D X , X , Y ) + λ L c y c ( F , G , X , Y )
最终的目标就是求得使目标最小的生成网络G,F,在实际训练过程中,上面的生成判别损失使用LSGA。cycleGAN的通俗解释图如下所示:
在判别损失部分的训练和正常的GAN一样,使得生成的A和目标A尽可能接近,B亦然。在循环一致性损失,就是让A生成的B通过B2A和原来的A尽可能接近,B生成的A通过A2B和原来的B尽可能接近。
参考:
1.https://blog.csdn.net/u011501388/article/details/77948644
2.https://www.jianshu.com/p/64bf39804c80
3.https://yq.aliyun.com/articles/229300