前言: CycleGAN是发表于ICCV17的一篇GAN工作,可以让两个domain的图片互相转化。传统的GAN是单向生成,而CycleGAN是互相生成,网络是个环形,所以命名为Cycle。并且CycleGAN一个非常实用的地方就是输入的两张图片可以是任意的两张图片,也就是unpaired。
单向GAN
读者可以按照原论文的顺序理解CycleGAN,这里我按照自己的思路解读。CycleGAN本质上是两个镜像对称的GAN,构成了一个环形网络。其实只要理解了一半的单向GAN就等于理解了整个CycleGAN。
上图是一个单向GAN的示意图。我们希望能够把domain A的图片(命名为a)转化为domain B的图片(命名为图片b)。为了实现这个过程,我们需要两个生成器
GAB
和
GBA
,分别把domain A和domain B的图片进行互相转换。图片A经过生成器
GAB
表示为Fake Image in domain B,用
GAB(a)
表示。而
GAB(a)
经过生辰器
GBA
表示为图片A的重建图片,用
GBA(GAB(a))
表示。最后为了训练这个单向GAN需要两个loss,分别是生成器的重建loss和判别器的判别loss。
判别loss
判别器 DB 是用来判断输入的图片是否是真实的domain B图片,于是生成的假图片 GAB(A) 和原始的真图片 B 都会输入到判别器里面,公示挺好理解的,就是一个0,1二分类的损失。最后的loss表示为:
LGAN(GAB,DB,A,B)=Eb∼B[logDB(b)]+Ea∼A[log(1−DB(GAB(a)))] 生成loss
生成器用来重建图片a,目的是希望生成的图片 GBA(GAB(a)) 和原图a尽可能的相似,那么可以很简单的采取 L1 loss或者 L2 loss。最后生成loss就表示为:
L(GAB,GBA,A,B)=Ea∼A[||GBA(GAB(a))−a||1]
以上就是A→B单向GAN的原理。
CycleGAN
CycleGAN其实就是一个A→B单向GAN加上一个B→A单向GAN。两个GAN共享两个生成器,然后各自带一个判别器,所以加起来总共有两个判别器和两个生成器。一个单向GAN有两个loss,而CycleGAN加起来总共有四个loss。CycleGAN论文的原版原理图和公式如下,其实理解了单向GAN那么CycleGAN已经很好理解。
X→Y的判别器损失为,字母换了一下,和上面的单向GAN是一样的:
同理Y→X的判别器损失为
而两个生成器的loss加起来表示为:
最终网络的所有损失加起来为:
- Note
论文里面提到判别器如果是对数损失训练不是很稳定,所以改成的均方误差损失,如下
LLSGAN(G,DY,X,Y)=Ey∼pdata(y)[(DY(y)−1)2]+Ex∼pdata(x)[(1−DY(G(x)))2]
下面放一张网友们自制的CycleGAN示意图,比论文原版的更加直观,出处见水印。
效果展示
CycleGAN的效果还是不错的,论文里给出了很多结果图,可以欣赏一下。