想把马变成斑马吗?制作DIY动漫人物或名人?生成对抗网络(GAN)是您最好的新朋友。
“Generative Adversarial Networks是过去10年机器学习中最有趣的想法。” - Facebook AI人工智能研究总监Yann LeCun
可以在此处找到本教程的第1部分:
图灵学习和GAN综合介绍
这是关于使用生成对抗网络创建深度生成模型的3部分教程的第二部分。这是关于变分自动编码器的上一个主题的自然扩展(可在此处找到)。我们将看到GAN在很大程度上优于变分自动编码器,但众所周知难以使用。
在本教程中,我们将解决以下主题:
- GAN的简短回顾
- GAN应用程序
- GAN问题
- 其他类型的GAN
- 构建图像GAN
- 编码教程
本文的大部分内容将涉及编码GAN以及对GAN的一些更高级实现的广泛介绍。
本教程中使用的所有代码都可以在我的GAN-Tutorial GitHub存储库中找到。
mrdragonbear / GAN-Tutorial
通过在GitHub上创建一个帐户,为mrdragonbear / GAN-Tutorial开发做出贡献。github.com
GAN的简短回顾
对于那些已阅读过第一部分的人,您可以跳过本节,因为我将重申GAN如何使用我之前的熊猫实例机械地工作。
最近引入了生成对抗网(在过去5年左右)作为训练生成模型的新方法,即创建能够生成数据的模型。它们由两个“对抗”模式:生成模型摹捕获的数据分发和判别模型d是估计的样本从训练数据,而不是附带的概率摹。既ģ和d可能是一个非线性映射函数,诸如多层感知
在生成对抗网络(GAN)中,我们有两个神经网络在零和游戏中相互对抗,其中第一个网络,即生成器,其任务是欺骗第二个网络,即鉴别器。生成器创建“假的”数据,在这种情况下,是大熊猫的图像,试图欺骗鉴别器将图像分类为真正的熊猫。我们可以迭代地改进这两个网络,以便生成逼真的图像以及执行其他一些非常酷的应用程序,其中一些我们将在本教程后面讨论。
最初,图像可能是相当明显的伪造,但随着网络变得更好,区分真实和虚假图像变得更加困难,即使对于人类也是如此!
这两个网络可以被认为是黑盒子,代表一些任意复杂的功能,应用于噪声或真实数据。生成器的输入是一些随机噪声,产生伪图像,鉴别器的输入既是伪样本,也是来自真实数据集的样本。然后,鉴别器做出关于所提供的图像z是真实图像D(z)= 1还是假图像D(z)= 0的二元判定。
为了训练两个网络,我们必须具有丢失功能,并且每个网络的丢失功能取决于第二网络。为了训练网络,我们进行反向传播,同时冻结其他网络的神经元权重。
如果您无法理解正在发生的事情,我建议您回过头来阅读第1部分,以更好地直观了解此培训程序的工作原理。
重要的是要注意,通常,鉴别器和生成器网络可以是任何形式的映射函数,例如支持向量机。正是GAN的这种概括通常被称为图灵学习。然而,在实践中,神经网络是最常见的,因为它们是任意非线性函数的广义函数逼近器。
我现在将讨论GAN的一些最酷的应用程序,然后再讨论一些更高级的主题,以及GAN的代码演练,旨在生成名人面孔和动漫角色。
GAN应用程序
在本节中,我将简要介绍一下我在数据科学研究过程中发现的一些最有趣的GAN应用。最常见的主题是:
- (有条件)合成 - 包括字体生成,Text2Image以及3D对象生成。
- 数据扩充 - 旨在减少对标记数据的需求(GAN仅用作增强其他模型的培训过程的工具)。
- 风格转移和操纵 - 面部老化,绘画,姿势估计和操作,修复和混合。
- 信号超分辨率 - 人为地提高图像的分辨率。
条件合成
在我看来,条件合成是相当不可思议的。可以说,条件合成最迷人的应用是Image2Text和Text2Image,它能够将图片翻译成文字(整个画面说千言万语),反之亦然。
这种应用影响深远,如果不仅仅是用于分析医学图像来描述图像的特征,从而消除了医生对图像的主观分析(这实际上是我目前正在尝试用乳房X光检查作为自己侧面项目的一部分)。
这也是另一种方式(假设我们给它的网络提供它理解的单词),并且图像可以纯粹从单词生成。以下是用于执行此文本到图像条件合成的多条件GAN(MC-GAN)的示例:
用于将单词翻译成图像的MC-GAN的实现。资料来源: https: //arxiv.org/pdf/1902.06068.pdf
数据扩充
这个是相当不言自明的。GAN像在查看VAE时一样学习数据生成分布。因此,我们可以从我们的发生器中采样并生成其他样本,我们可以使用这些样本来增强我们的训练集。因此,GAN提供了另外的方法来执行数据增加(除了旋转和扭曲图像之外)。
风格转移和操纵
风格转移是不言自明的。它涉及将一个图像的“样式”转移到另一个图像上。这与神经风格转移非常相似,我将在以后的文章中讨论。
这对于背景场景非常有效,并且类似于图像过滤,除了我们可以操纵实际图像的各个方面(比较上面图像中的云以用于输入和输出)。
GAN如何在动物或水果等其他物体上表现?
看起来相当不错!如果我对GAN一无所知,我可能会认为马的形象实际上是风格转移后的斑马。
我们还可以改变风景来操纵季节,这对于视频游戏和虚拟现实模拟器等事物来说可能是有用的操作。
我们还可以使用GAN更改景深。
我们还可以操纵绘图,将它们变成真实的物体,相对容易(但是,这可能需要比我目前拥有的绘画技能更多)。
自动驾驶汽车以与下图相似的视角看世界,这样可以以更加对比的方式(通常称为语义地图)观察物体。
我们甚至可以进行风格转换来渲染图像,如侠盗猎车手的环境(适用于那里的任何粉丝)。
我们也可以以同样的方式将白天转移到夜晚。
关于风格转移和图像处理就足够了。这有很多很好的应用,但我们已经看到了该技术的几种恶意使用,人们冒充政治人物并制造虚假的电话交谈,电子邮件等。
这实际上是一个问题,美国军方正在开发一个新的取证领域来研究视频和媒体的类似例子,以确定它们是否是由GAN产生的(哦,我的,我们生活的世界......)。
图像超分辨率
图像超分辨率(SR)是指从低分辨率(LR)图像中恢复高分辨率(HR)图像的过程,是计算机视觉和图像处理中一类重要的图像处理技术。
通常,该问题非常具有挑战性并且固有地不适合,因为总是存在对应于单个LR图像的多个HR图像。
已经应用各种深度学习方法来处理SR任务,范围从早期基于卷积神经网络(CNN)的方法(例如,SRCNN)到最近使用GAN的有希望的SR方法(例如,SRGAN)。通常,使用深度学习技术的SR算法族在以下主要方面彼此不同:不同类型的网络架构,不同类型的损失函数,不同类型的学习原理和策略等。
实现这一目的的过程实际上非常复杂,所以我不会在本文中详细介绍(尽管如果读者感兴趣我会在将来讨论这个问题)。
可以在此处找到有关GAN的样式传输的全面概述。
GAN问题
我们在前一篇文章中讨论了GAN的一些最基本的问题,主要是需要大量的计算能力,大图像训练的难度,灵敏度以及模态崩溃。
我想重申这些问题,因为培训GAN非常困难且耗时。GAN还有很多其他问题,在学术界(至少在哈佛),有一个笑话,如果你想训练一个GAN,你会选择一个毫无防备和天真的研究生为你做这个(我一直在这个笑话的接收端)。
振荡
当发生器和鉴别器共同寻找平衡时,可能发生振荡,但模型更新是独立的。没有理论上的收敛性保证,事实上,结果可能会发生变化。
![GAN表现出消失的梯度问题
解决方案不是预先训练鉴别器,或者与发生器相比降低其学习率。也可以在每次迭代时更改生成器/鉴别器的更新次数(正如我在第1部分中所建议的那样)。
很容易看出GAN何时融合,因为两个网络的稳定性将发生在中间地带的某个地方(即其中一个网络不占主导地位)。
GAN中Nash均衡的极小极大表达式
模态崩溃
发生器可以折叠,以便始终生成相同的样本。当发生器被约束到小子空间并因此开始生成低分集的样本时,这可能发生。
以上生成的图像中的五个看起来相同,并且其他几个看起来成对出现。
对此的解决方案是通过小批量区分(将整个批次呈现给鉴别器以供审查)或通过特征匹配(即,为低多样性添加发生器惩罚)或使用多个GAN来鼓励多样性。
评估指标
这是我在前一篇文章中没有提到的。GAN仍然在非常定性的基础上进行评估 - 基本上,这个图像看起来很好吗?定义有些客观的适当指标令人惊讶地具有挑战性。“好”的发电机看起来如何?
对此没有明确的解决方案,它仍然是一个活跃的研究领域,并且具有特定领域的特定领域。强分类模型通常用于判断生成样本的质量。使用的两个常见分数是初始分数和TSTR分数(Train on Synthetic,Test on Real)。
Jonathan Hui有一篇相当全面的文章,解释了用于评估GAN性能的最常用指标,您可以在此处找到:
GAN - 如何衡量GAN性能?
在GAN中,发电机和鉴别器的目标函数通常衡量它们的运行情况......medium.com
在下一节中,我将概述一些从学术领域出现的最重要的GAN类型。
其他类型的GAN
还有许多其他类型的GAN已经出现,用于解决特定于域的问题以及不同类型的数据(例如,时间序列,图像或普通的csv样式数据)。
我将在本节讨论的GAN类型是:
- Wasserstein GAN
- CycleGAN
- 条件GAN(前面简要讨论过)
Wasserstein GAN
在我看来,这是最重要的GAN类型,所以要注意!
使用标准的GAN配方,我们已经观察到训练非常不稳定。鉴别器通常改进太快以至于发电机不能赶上,这就是为什么我们需要调节学习速率或在两个网络之一上执行多个时期。为了获得合适的输出,我们需要仔细平衡,即使这样,模态崩溃也是非常频繁的。
信息来源: Arjovsky,M.,Chintala,S。和Bottou,L.,2017年.Wasserstein GAN。arXiv preprint arXiv:1701.07875。
一般而言,生成模型试图最小化实际和学习分布之间的距离(距离就是一切!)。Wasserstein(也称为EM,Earth-Mover)距离,非正式地指的是当分布被解释为在区域D上堆积一定量污垢的两种不同方式.Wasserstein距离是转动一堆的最小成本进入另一个; 假设成本是移动的污垢量乘以它移动的距离。
不幸的是,在这种情况下,精确的计算是难以处理的。但是,我们可以使用CNN来估算Wasserstein距离。在这里,我们重用了鉴别器,其输出现在是无界的。我们定义了与Wasserstein损失相对应的自定义损失函数:
这里有什么想法?我们可以尽可能地对一种类型进行预测,对尽可能小的其他类型进行预测。
Wasserstein论文的作者声称:
- 在训练期间更高的稳定性,更少需要仔细平衡发电机和鉴别器。
- 有意义的损失度量,与样本质量很好地相关。
- 模态崩溃很少见。
在Keras实施Wasserstein GAN的提示。
- 使鉴别器输出无限制,即应用线性激活。
- 使用小权重进行初始化,以便从一开始就不会遇到剪切问题。
- 请记住运行足够的鉴别器更新。这在WGAN设置中至关重要。
- 您可以使用Wasserstein代理损失实施。
- 通过实现您自己的Keras约束来剪辑鉴别器权重。
这是一个复杂的主题,实施Wasserstein GAN并不是一项简单的任务。如果您有兴趣为个人项目寻求其中一项,我建议您阅读我之前提到的原始论文。
CycleGAN
还记得我们看到一匹马与斑马交换的第一张图片吗?这是一个CycleGAN。CycleGAN将样式传输到图像。这与进行神经风格转移基本相同,我将在以后的文章中介绍。
举一个例子,想象一下着名的,如金门大桥的照片,然后从另一幅图像中提取风格,这可能是一幅着名的画作,并以所述着名画作的风格重新绘制桥梁的图片。 。
作为我的神经传递学习文章的预告片,这是我之前做过的一个例子。
结合着名的“神奈川大浪”与芝加哥天际线的风格
将GAN应用于这些类型的问题相对简单,它本质上是图像重建。我们使用第一个网络G将图像x转换为y。我们用另一个深度网络F来反转该过程以重建图像。然后,我们使用均方误差MSE来指导G和F的训练。
这里的不同之处在于我们实际上并不关心重建图像,我们试图混合两个图像的样式。在GAN实现中,将鉴别器D添加到现有设计中以指导发电机网络更好地执行。D充当训练样本和生成的图像之间的批评者。通过这种批评,我们使用反向传播来修改生成器以产生图像,以解决由鉴别器识别的缺点。在这个问题中,我们引入了一个鉴别器D,以确保Y类似于梵高的绘画。
CycleGAN将图片从一个域传输到另一个域。在真实图像和梵高绘画之间转换图片。我们建立了三个网络。
- 生成器G将真实图像转换为梵高风格图片。
- 生成器F将梵高风格的图片转换为真实图像。
- 鉴别器D用于识别真实或生成的梵高图片。
对于反方向,我们只是反转数据流并构建一个额外的鉴别器来识别真实图像。
创建斑马/马图像的此实现的示例如下所示。
有条件的GAN
与在VAE中一样,GAN可以简单地用于生成特定的数据模式。有条件的GAN的参考文献可以在这里找到。
如果生成器和鉴别器都以某些额外信息c为条件,我们可以将GAN的生成模型扩展到条件模型。该c可以是任何类型的辅助信息,例如类标签或来自其他模态的数据。我们可以通过将c作为附加输入层馈入鉴别器和发生器来执行调节。
在生成器中,先前输入噪声p(z)和c在联合隐藏表示中组合,并且对抗训练框架允许在如何组成该隐藏表示时具有相当大的灵活性。在鉴别器中,x和c表示为输入和判别函数。
GAN故障排除
对于那些喜欢摘要的人,请简要概述我们到目前为止讨论过的所有故障排除方法。
[1]模型。确保正确定义模型。您可以通过培训香草图像分类任务来单独调试鉴别器。
[2]数据。将输入正确归一化为[-1,1]。在这种情况下,确保使用tanh作为生成器的最终激活。
[3]噪音。尝试从正态分布(不均匀)中采样噪声向量。
[4]规范化。尽可能应用BatchNorm,并在单独的小批量中发送真实和假冒样本。
[5]激活。使用LeakyRelu而不是Relu。
[6]平滑。应用标签平滑以避免在更新鉴别器时过度自信,即将实际图像的目标设置为小于1。
[7]诊断。不断监测梯度的大小。
[8]消失的渐变。如果鉴别器变得太强(鉴别器丢失= 0),尝试降低其学习速率或更频繁地更新发生器。
现在让我们进入有趣的部分,实际上构建一个GAN。
构建图像GAN
正如我们已经多次讨论过的那样,培训GAN可能会令人沮丧且耗费时间。我们将在Keras中介绍一个干净的最小例子。结果仅在概念证明级别上以增强理解。在代码示例中,如果不仔细调整参数,则不会超过图像生成的这个级别(见下文):
网络拍摄图像[H,W,C]并输出[M]的矢量,**分类(分类)或单个分数量化照片写实。可以是任何图像分类网络,例如ResNet或DenseNet。我们使用简约的自定义架构。
采用噪声矢量[N]并输出[H,W,C]的图像。网络必须执行综合。同样,我们使用非常简约的自定义架构。
在Keras中正确定义模型非常重要,这样可以在正确的时间固定各个模型的权重。
[1]定义鉴别器模型,并进行编译。
[2]定义生成器模型,无需编译。
[3]定义由这两者组成的整体模型,在编译之前将鉴别器设置为不可训练:
在最简单的形式中,这就是训练GAN所需要做的一切
训练循环必须手动执行:
[1]从训练集中选择R实像。
[2] 通过对大小为N的随机向量进行采样,并使用生成器从它们预测图像来生成F伪图像。
[3]使用train_on_batch训练鉴别器:分别为R真实图像批次和F伪图像调用它,地面实况分别为1和0。
[4]采样大小为N的新随机向量。
[5]使用train_on_batch训练新模型的完整模型,目标为1.这将更新生成器。
最后评论
在本教程中,我已经介绍了GAN的高级主题,它们的架构和当前的应用程序,以及简单的GAN的编码实现。在本教程的最后部分,我们将比较VAE,GAN的性能以及VAE-GAN的实现,以生成动画图像。
谢谢你的阅读!请继续关注第3部分。
进一步阅读
在COLAB中运行BigGAN:
- https://colab.research.google.com/github/tensorflow/hub/blob/master/examples/colab/biggan_generation_with_tf_hub.ipynb
更多代码帮助+示例:
- https://www.jessicayung.com/explaining-tensorflow-code-for-a-convolutional-neural-network/
- https://lilianweng.github.io/lil-log/2017/08/20/from-GAN-to-WGAN.html
- https://pytorch.org/tutorials/beginner/dcgan_faces_tutorial.html
- https://github.com/tensorlayer/srgan
- https://junyanz.github.io/CycleGAN/ https://affinelayer.com/pixsrv/
- https://tcwang0509.github.io/pix2pixHD/
有影响力的论文:
- DCGAN https://arxiv.org/pdf/1511.06434v2.pdf
- Wasserstein GAN(WGAN)https://arxiv.org/pdf/1701.07875.pdf
- 条件生成性对抗网(CGAN)https://arxiv.org/pdf/1411.1784v1.pdf
- 使用拉普拉斯金字塔的对抗网络的深度生成图像模型(LAPGAN)https://arxiv.org/pdf/1506.05751.pdf
- 使用生成对抗网络(SRGAN)的照片真实单图像超分辨率https://arxiv.org/pdf/1609.04802.pdf
- 使用周期一致的对抗网络(CycleGAN)进行不成对的图像到图像转换https://arxiv.org/pdf/1703.10593.pdf
- InfoGAN:可解释的代表性信息学习最大化生成性对抗网络https://arxiv.org/pdf/1606.03657
- DCGAN https://arxiv.org/pdf/1704.00028.pdf
- 改进了Wasserstein GAN的培训(WGAN-GP)https://arxiv.org/pdf/1701.07875.pdf
- 基于能量的生成性对抗网络(EBGAN)https://arxiv.org/pdf/1609.03126.pdf
- 使用学习的相似性度量(VAE-GAN)自动编码超出像素https://arxiv.org/pdf/1512.09300.pdf
- 对抗特征学习(BiGAN)https://arxiv.org/pdf/1605.09782v6.pdf
- 堆叠生成对抗网络(SGAN)https://arxiv.org/pdf/1612.04357.pdf
- StackGAN ++:堆叠生成对抗网络的逼真图像合成https://arxiv.org/pdf/1710.10916.pdf
- 通过对抗训练(SimGAN)学习模拟和非监督图像https://arxiv.org/pdf/1612.07828v1.pdf