CycleGAN之美 赛马翻译成斑马背后的直觉和数学(附论文)
作者:Sebastian Theiler
翻译:吴金笛
校对:张玲
本文约2300字,建议阅读10分钟。
本文介绍了CycleGAN的映射原理和4项损失的基本含义,并提供了详细的损失方程。
本文假定你已经对GANs的工作方式有非常深刻的了解。如果你想快速回顾一下,或者完全不了解GANs,我这有一篇关于它们的、以前写的文章可供参考
(https://medium.com/analytics-vidhya/
implementing-a-gan-in-keras-d6c36bc6ab5f)。
CycleGAN的目标很简单,学习某个数据集X与另一个数据集Y之间的映射。例如,X可以是赛马图像数据集,Y可以是斑马图像数据集。
图片链接:https://arxiv.org/pdf/1703.10593.pdf
CycleGAN的美妙之处在于X和Y不一定是成对的。我们可以为CycleGAN 提供X的任意图像和Y的任意图像,这意味着Y中的每一个图像不是X中相关图像的直接映射。
CycleGAN还可以做什么?
很多。
CycleGAN几乎可以做任何涉及到照片编辑的操作。包括:
- 昼夜交换图像
- 季节/温度变化
- 从轮廓渲染逼真的图像
- 从图像中添加或删除元素,例如树木
- 自动为黑白图像着色
还有更多。
那么CycleGAN是如何学习这种映射的呢?让我们来看看。
CycleGAN由两个发生器和两个判别器组成。
第一个生成器,G,需要一个图像,X中的x,并将其映射成ŷ。理想情况下 ŷ与属于Y的真实图像没有区别。
然后,一个判别器Dy尝试对图像进行分类,判断图像是Y中真实采样出来的还是由G虚假最终生成的。
形式上,映射函数G:X→Y的目标及其判别符Dy表示为:
简而言之,该目标函数衡量的是判别器对于真实图像的输出log Dy(y)有多接近于1,并且对于虚假图像的输出log(1-Dy(G(x)))有多接近于0。
仅此还不足以保证合适的结果。所有这些可以确保的是,G将产生与真实Y图像相似的图像,但不能确保ŷ将是x的合适映射。
在CycleGAN论文(https://arxiv.org/pdf/1703.10593
.pdf)中,引入第二个生成器F。F是G的逆操作;它从Y获取图像并返回x,这是一个与X中图像相似的图像。
F有其自己的判别符Dx,它试图对图像进行区分:由F生成还是从X采样。应用于G和Dy的相同损失函数也应用于F和Dx。
作者在这里执行的出色策略称为循环一致性。循环一致性表明,如果G将x转换为ŷ,则F应该能够将ŷ转换为x,反之亦然。
例如,如果我们从英语中获取一个句子并将其翻译成法语,那么我们应该能够将该句子翻译回原始的英语句子。
更正式地说,循环一致性损失表示为:
这里||x||代表X的平均绝对误差,或者MAE。
取x和y的平均绝对误差(其中x和y均为n维向量)是一种测量这些向量之间的距离的方法。MAE将每个元素的绝对距离取平均值,然后将其平均为一个整数。
现在我们有三个单独的损失,G对Dy的对抗损失,F对Dx的对抗损失以及两个生成器的循环一致性损失。从技术上讲,这足以训练一个CycleGAN,但是通常会增加第四个损失:特征损失,这是有益的。
特征损失很简单,G(y)应该≈y,F(x)应该≈x。特征损失公式表示为:
添加特征损失通常有助于保留翻译图像中的颜色和色彩,特别是对于照片到图像的生成。
我们有四个损失,两个是对抗损失,其余是循环一致性损失和特征损失,但是这些损失并不重要。 与对抗性损失相比,我们可能希望更加重视循环一致性损失,反之亦然。
为了解决这个问题,作者引入了λ。 在最终损失方程中,循环一致性损失项乘以λ,或多或少地赋予了它重要性。 作者在实验中将λ设为10。
因此,如果将所有内容放在一起,完整的损函数被定义为:
而且,尽管没有正式的完全特征损失函数,但通常会加上权重0.5 *λ:
但是,就像我说的那样,并没有完全正式的方程式,你可以随意设计它。
好的,所以我们知道CycleGAN的损失函数,但是我们如何实际构建模型?
对于生成器,作者描述了四种类型的块:
- c7s1-k表示具有k个过滤器和步幅为1的7×7 Convolution-InstanceNorm-ReLU。这些块用于生成器中的基本卷积计算。
- dk表示具有k个过滤器和步幅2的3×3 Convolution-InstanceNorm-ReLU。dk块用于将卷积大小下采样2倍。
- Rk表示包含两个3×3卷积层的剩余块,每层上有k个过滤器。Rk块用于生成 “潜空间”的循环连接。
- uk表示3×3的分数阶Convolution-InstanceNorm-ReLU层,具有k个过滤器,步幅为½。uk块是dk块的一种逆操作,因为它们将图像上采样两倍。
放置了这些块后,用于256×256或更高像素图像的生成器定义为:
用于128×128图像的生成器仅使用六个R256块,而不是九个:
作者将70×70 PatchGAN用于判别器网络。
- Ck表示一个4×4 Convolution-InstanceNorm-LeakyReLU层,具有k个滤波器和步幅2
最终的判别器架构是:
请注意,与我们之前看到的判别器架构不同,该架构不会输出单个标量值。PatchGAN体系结构返回一个称为X的N×N个输出数组,不要与我们要转换的数据集混淆。Xij是对每小块ij进行真假判别,将一张图片所有patch的结果取平均值作为最终的判别输出。
判别符的构造方式,X的每个索引都与原始图像的70×70区域有关。 如果我们手动将原始图像切成70×70的色块,并在每个色块上运行常规判别符,我们将获得相同的结果。 没有规定要求每小块均为70×70,该尺寸只是网络架构的一个偶然结果。
让我们回顾一下我们学到的一切。
- CycleGAN尝试学习从一个数据集X到另一个数据集Y的映射,例如从马到斑马
- 它使用两个生成器G和F以及两个判别器Dx和Dy来执行此操作:
- G试图将X变成Y,F试图将Y变成X
- Dx尝试区分从X采样的真实图像和F生成的图像。F会相应更新,以更好地欺骗Dx
- Dy试图区分从Y采样的真实图像和G产生的图像。G会相应更新,以更好地欺骗Dy。
- 添加了循环一致性损失以确保生成器输出的图像可以被另一个生成器映射回原始图像,即F(G(x))≈x和G(F(y))≈y
- 添加了特征损失以帮助保持色彩。它声明当给定目标类的图像时,生成器应返回相同的图像,即F(x)≈x和G(y)≈y
- λ是添加的一项,用于定义与GAN损失相比,循环一致性和特征损失的相对重要性
- 生成器使用一系列卷积层和残差卷积层将一个图像映射到另一个图像
- 判别器使用PatchGAN架构对图像进行分类
就是这样!
我建议阅读有关CycleGAN的原始论文(在“更多阅读”下链接),因为它是我很久以来阅读过的最有趣,结构最好的论文之一。
我计划不久就在Keras和Tensorflow 2.0中编写一个实现CycleGAN的教程,如果你感兴趣,请继续关注。
更多阅读:
原始CycleGAN论文:
https://arxiv.org/pdf/1703.10593.pdf
原始 GAN 论文:
https://arxiv.org/pdf/1406.2661.pdf
实例正则:
https://arxiv.org/pdf/1607.08022.pdf
我以前的关于GANs的文章:
https://medium.com/analytics-vidhya/implementing-a-gan-in-keras-d6c36bc6ab5f
原文标题:
The Beauty of CycleGAN
原文链接:
https://medium.com/analytics-vidhya/the-beauty-of-cyclegan-c51c153493b8
编辑:于腾凯
校对:林亦霖
译者简介
吴金笛,雪城大学计算机科学硕士一年级在读。迎难而上是我最舒服的状态,动心忍性,曾益我所不能。我的目标是做个早睡早起的Cool Girl。
— 完 —
关注清华-青岛数据科学研究院官方微信公众平台“THU数据派”及姊妹号“数据派THU”获取更多讲座福利及优质内容。