【论文笔记】CycleGAN

前言: CycleGAN是发表于ICCV17的一篇GAN工作,可以让两个domain的图片互相转化。传统的GAN是单向生成,而CycleGAN是互相生成,网络是个环形,所以命名为Cycle。并且CycleGAN一个非常实用的地方就是输入的两张图片可以是任意的两张图片,也就是unpaired。

【论文笔记】CycleGAN_第1张图片

单向GAN

读者可以按照原论文的顺序理解CycleGAN,这里我按照自己的思路解读。CycleGAN本质上是两个镜像对称的GAN,构成了一个环形网络。其实只要理解了一半的单向GAN就等于理解了整个CycleGAN。

【论文笔记】CycleGAN_第2张图片
上图是一个单向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)=EbB[logDB(b)]+EaA[log(1DB(GAB(a)))]

  • 生成loss
    生成器用来重建图片a,目的是希望生成的图片 GBA(GAB(a)) 和原图a尽可能的相似,那么可以很简单的采取 L1 loss或者 L2 loss。最后生成loss就表示为:

    L(GAB,GBA,A,B)=EaA[||GBA(GAB(a))a||1]

以上就是A→B单向GAN的原理。

CycleGAN

CycleGAN其实就是一个A→B单向GAN加上一个B→A单向GAN。两个GAN共享两个生成器,然后各自带一个判别器,所以加起来总共有两个判别器和两个生成器。一个单向GAN有两个loss,而CycleGAN加起来总共有四个loss。CycleGAN论文的原版原理图和公式如下,其实理解了单向GAN那么CycleGAN已经很好理解。

【论文笔记】CycleGAN_第3张图片

X→Y的判别器损失为,字母换了一下,和上面的单向GAN是一样的:

LGAN(G,DY,X,Y)=Eypdata(y)[logDY(y)]+Expdata(x)[log(1DY(G(x)))]

同理Y→X的判别器损失为
LGAN(F,DX,Y,X)=Expdata(x)[logDX(x)]+Eypdata(y)[log(1DX(F(y)))]

而两个生成器的loss加起来表示为:
Lcyc(G,F)=Expdata(x)[||F(G(x))x||1]+Eypdata(y)[||G(F(y))y||1]

最终网络的所有损失加起来为:
L(G,F,DX,DY)=LGAN(G,DY,X,Y)+LGAN(F,DX,Y,X)+Lcyc(G,F)

  • Note
    论文里面提到判别器如果是对数损失训练不是很稳定,所以改成的均方误差损失,如下
    LLSGAN(G,DY,X,Y)=Eypdata(y)[(DY(y)1)2]+Expdata(x)[(1DY(G(x)))2]

下面放一张网友们自制的CycleGAN示意图,比论文原版的更加直观,出处见水印。
【论文笔记】CycleGAN_第4张图片
【论文笔记】CycleGAN_第5张图片

效果展示

CycleGAN的效果还是不错的,论文里给出了很多结果图,可以欣赏一下。
【论文笔记】CycleGAN_第6张图片
【论文笔记】CycleGAN_第7张图片
【论文笔记】CycleGAN_第8张图片

你可能感兴趣的:(深度学习,论文笔记)