读论文也读代码,Cycle GAN与Pix2Pix GAN

文本翻译是一个机器学习当中常见的应用,人们可以用英语,法语,德语等不同语言表达相同的意思。与之相对,图像也有很多表达翻译方式,比如灰度图翻译成彩色图,轮廓翻译成实物等。图像也能像语言一样相互转换,我们可以叫它图像变换,或者图像翻译。

8月份我开始写“民科带你读文章”系列后,接触到了很多有趣的内容,其中非常吸引我的就有GAN的各种变化。那时候有朋友推荐我Pix2Pix GAN和Cycle GAN,但一直没时间阅读实现。上周末我参考着yenchenlin和xhujoy的代码读了读论文,觉得受益匪浅。

Pix2Pix GAN

Pix2Pix的模型框架与cGAN类似,判别网络的输入是将两张图片组合到一起的pair,输入就从rgb的三通道图像变成了6通道两个图像的叠加图。对比最初的GAN模型,判别网络就从D(x)变成D(x,y),整体结构如下:

为了作对比,我们需要去训练生成网络G,让它去混淆判别网络D。和我第一篇民科文章介绍图像补全类似的是,生成网络G首先将输入图像X进行编码,得到向量后进行解码,最后生成图像Y。这里作者提到了一个新的用法U-Net,我会在下一章讲讲实现细节。

除了传统的生成网络G之外,和我们之前提到的图像补全任务相似,我们需要训练样例帮助我们监督生成出来的图像色彩和形状。为了保证输出图像和目标图像之间的相似度,这里作者引入了L1 Loss帮助减少误差,L1 Loss能够很大程度上减少图像的模糊度,这点比L2 Loss要做的好。以下是训练引入L1 Loss之前和之后的结果:

Pix2Pix小细节

作者在Pix2Pix的生成网络中引入了U-Net这个概念。因为在图像翻译的任务当中,输入图片和输出图片会共享很多信息。如果只是使用卷积神经网络,那么每一层都要保存非常多的信息,变得难以训练。作者使用了skip-connection,将原图不同的卷积层合并到生成图不同的卷积层上,帮助扩充信息,从而减轻训练负担。

我们假设e(i)是第i层编码层,d(j)是第j层解码层,在生成网络中我们将e(i)和d(8-j)合并,这里的8是指目前设置的编码和解码层数,代码如下:

在上一章最后一图里,也展示了采用U-Net和不采用U-Net情况下对应的结果。可以看出采用U-Net图像细致了很多。其实从我个人角度来看,U-Net的思想和Residual Network的思想非常类似,都是借用之前的信息来帮助训练的一种办法。

在Pix2Pix文章中还引入了一个小技巧Patch,这点后来又被NVIDIA应用到他们的高清图像生成任务当中。Patch是指不管在生成网络还是判别网络当中,图像并不是被当做整个图像作为输入,而是以分割好的Patch来进行的。

我们将图像分为NxN的Patch后,对于每一块进行操作,这样既减少了程序运行时间,又使程序能够更好的处理大图像上的细节,也算是点睛一笔。

对Pix2Pix GAN实现感兴趣的朋友,除了原作者开发的版本外,这里还有yanchenlin实现的tensorflow版本: https://github.com/yenchenlin/pix2pix-tensorflow

Cycle GAN

Cycle GAN是今年3月发表的文章,可是我现在才有空阅读并且模仿实现代码。它和Pix2Pix GAN神似,但是因为作者创意的提出了cycle consistency loss,使得训练对数据的要求降低,实用性更强。

和Pix2Pix GAN相似的是,Cycle GAN也是把一类图片翻译成另一类图片。Pix2Pix GAN要求训练样例必须是两两一组成对的,这样的数据在现实生活中很难采集。Cycle GAN则放开了这个条件,他们学习两个生成函数G和F,一个把样例从空间X映射到空间Y,另一个把样例从空间Y映射到空间X。在学习生成函数的时候,我们也学习了两个判别函数DX和DY。

然而,当我们有足够大的训练数据时,这样学习出来的网络可以将同一组输入图像X映射到输出图像Y的任意排列上,而不是一对一的翻译。所以作者提出了cycle consistency loss的概念,也就是将图像X映射到Y后再映射到X,同时优化X=F(G(X))。

这一段的代码也非常容易实现,在定义好distriminator和generator之后,我们可以对输入A和B得到生成结果fake_B和fake_A,再次放入网络中得到fake_A_和fake_B_,然后对比A与fake_A_以及B与fake_B_的相似性。

Cycle GAN的创新

下面这个小gif是大家展现Cycle GAN功能时最常用的例子,效果十分惊人。我们可以对比DCGAN以及Pix2Pix GAN来看看Cycle GAN的新意。

DCGAN是基于最原始的GAN模型的框架,输入是随机的噪音z,输出是一张图片,我们根本没有办法去控制输出图片的样子。之前也有论文提到过训练生成网络G,先将人脸和特征进行encoding,然后再将embedding生成出原始图片,通过加减拥有同一个特征的人脸的embedding进行转化。

与Pix2Pix GAN的对比在上文也提到过,Pix2Pix的模型必须要求对称数据,而Cycle GAN则利用非对称数据,就像论文题目一样“Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks”。容易收集的数据加充满创意的训练目标,我想这就是为什么大家都觉得Cycle GAN非常有趣的原因吧。

对Cycle GAN实现感兴趣的朋友,除了原作者开发的版本外,这里还有xhujoy实现的tensorflow版本: https://github.com/xhujoy/CycleGAN-tensorflow

小结

GAN可以说自诞生之后就非常的火,通过Pix2Pix训练图像转化很有趣,Cycle GAN又让这一个问题变得更加实用,因为只需要收集两类不同的图片就可以开始训练了。所以说,2017年的最后一篇民科带你读系列文章就换个名字以Pix2Pix GAN和Cycle GAN结尾吧。

明年我还会读更多文章,主要关注工业界机器学习系统和实践,其次了解一下研究领域前沿技术。接近年尾,下周准备做个小总结,还望各位老师朋友继续支持我。

欢迎关注硅谷程序汪

原创文章,版权所有。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171221G0DNE700?refer=cp_1026

相关快讯

扫码关注云+社区