风格迁移问题中,我们需要实现从输入图片到输出图片的映射,那么在训练一个Generator的时候我们需要成对的训练集,然而成对的训练集并不容易获得

因此我们希望采用GAN的形式处理风格迁移问题,G负责学习映射,D负责判别是否为规定风格

然而GAN处理的问题就在于自由度过大,可能一张清明上河图进到GAN里面风格转化的结果是一张梵高的自画像,即G完全可以为了骗过D将Domain X中的所有内容映射到Domain Y中的一张图,使得损失函数无效化

那么我们需要的就不仅是风格上的正确了,而是图片的分布也不能发生太大的变化

所以除去生成器G(XY)之外,我们再建立一个生成器G(YX),我们希望在一张图片被映射到Domain Y之后能够被映射回Domain X,且与原来的图片大致相同

与此同时,一张图片在通过G(YX)映射到Domain X之后,也应该能通过G(XY)得到一张和原图大致相同的图片

定义一个循环一致性损失
$L_{cyc}(F,G,X,Y)=E_{x \sim p_{data(x)}}[||G(F(x))-x||1]+E{y \sim p_{data(y)}}[||F(G(y))-y||_1]$

最终的损失函数由三部分组成
L=LGAN(G(XY)DY)+LGAN(G(YX)DX)+Lcyc(G(XY),G(YX),X,Y)

LGAN即基础GAN的损失函数

CycleGAN的方法和传统的pix2pix相比对数据集的要求更低
比如需要做春和秋两种风格变换的,并不需要pair的数据,只要一个春风格的数据集和一个秋风格的数据集即可,并且训练完成后能够实现双向转化