第 8 章,“条件 GAN – 使用条件对抗网络进行图像到图像的翻译”,介绍了如何训练条件 GAN 进行图像到图像的翻译。 我们将首先介绍条件 GAN 和不同的数据准备技术,例如数据收集,数据清理和数据格式化。 接下来,我们将在 Jupyter 笔记本的 Keras 中编写条件 GAN 的代码。 接下来,我们学习如何在已经准备好的数据集上训练条件 GAN。 我们将探索不同的超参数进行训练。 最后,我们将测试条件 GAN,并讨论实际应用中图像到图像转换的不同用例。
3D-GAN 是用于 3D 形状生成的 GAN 体系结构。 由于处理 3D 图像涉及复杂性,因此 3D 形状生成通常是一个复杂的问题。 3D-GAN 是一种可以生成逼真的,变化的 3D 形状的解决方案,由吴嘉俊,张成凯,薛天凡等人在题为*的论文中介绍,该文章通过 3D 生成专家模型学习对象形状的概率潜在空间 建模*。 可以在[这个页面](http://3dgan.csail.mit.edu/papers/3dgan_nips.pdf)上找到该论文。 在本章中,我们将使用 Keras 框架实现 3D-GAN。
3D-GAN 是用于 3D 形状生成的 GAN 体系结构。 由于处理 3D 图像涉及复杂性,因此 3D 形状生成通常是一个复杂的问题。 3D-GAN 是一种可以生成逼真的,变化的 3D 形状的解决方案,由吴嘉俊,张成凯,薛天凡等人在题为《通过 3D 生成对抗建模学习对象形状的概率潜在空间》的论文中介绍,可以在[这个页面](http://3dgan.csail.mit.edu/papers/3dgan_nips.pdf)上找到该论文。 在本章中,我们将使用 Keras 框架实现 3D-GAN。
我们将涵盖以下主题:
...
...
@@ -24,7 +24,7 @@
**3D 生成对抗网络**(**3D-GAN**)是 GAN 的变体,就像 StackGAN,CycleGAN 和`S`**上层分辨率一样 生成对抗网络**(**SRGAN**)。 与香草 GAN 相似,它具有生成器和鉴别器模型。 这两个网络都使用 3D 卷积层,而不是使用 2D 卷积。 如果提供足够的数据,它可以学习生成具有良好视觉质量的 3D 形状。
**3D 生成对抗网络**(**3D-GAN**)是 GAN 的变体,就像 StackGAN,CycleGAN 和`S`**上层分辨率一样 生成对抗网络**(**SRGAN**)。 与朴素 GAN 相似,它具有生成器和判别器模型。 这两个网络都使用 3D 卷积层,而不是使用 2D 卷积。 如果提供足够的数据,它可以学习生成具有良好视觉质量的 3D 形状。
在仔细查看 3D-GAN 网络之前,让我们了解 3D 卷积。
...
...
@@ -50,9 +50,9 @@
3D-GAN 中的两个网络都是深度卷积神经网络。 发电机网络通常是一个上采样网络。 它对噪声向量(来自概率潜在空间的向量)进行上采样,以生成形状为的 3D 图像,该形状的长度,宽度,高度和通道与输入图像相似。 鉴别器网络是下采样网络。 使用一系列 3D 卷积运算和密集层,它可以识别提供给它的输入数据是真实的还是伪造的。
3D-GAN 中的两个网络都是深度卷积神经网络。 发电机网络通常是一个上采样网络。 它对噪声向量(来自概率潜在空间的向量)进行上采样,以生成形状为的 3D 图像,该形状的长度,宽度,高度和通道与输入图像相似。 判别器网络是下采样网络。 使用一系列 3D 卷积运算和密集层,它可以识别提供给它的输入数据是真实的还是伪造的。
在接下来的两节中,我们将介绍生成器和鉴别器网络的体系结构。
在接下来的两节中,我们将介绍生成器和判别器网络的体系结构。
...
...
@@ -90,11 +90,11 @@ A fully convolutional network is a network without fully connected dense layers
# 鉴别器网络的架构
# 判别器网络的架构
鉴别器网络包含五个具有以下配置的体积卷积层:
判别器网络包含五个具有以下配置的体积卷积层:
***3D 卷积层**:5
***通道**:64、128、256、512、1
...
...
@@ -110,11 +110,11 @@ A fully convolutional network is a network without fully connected dense layers
***输入**:形状为(64,64,64)的 3D 图像
***输出**:输入数据属于真实或假类的概率
下图显示了鉴别器网络中每一层的张量流以及张量的输入和输出形状。 这将使您对鉴别器网络有更好的了解:
下图显示了判别器网络中每一层的张量流以及张量的输入和输出形状。 这将使您对判别器网络有更好的了解:
![](img/7fc08303-569e-499f-bc91-e2ae9684f947.png)
鉴别器网络主要镜像生成器网络。 一个重要的区别是它使用中的 LeakyReLU 代替了 ReLU 作为激活功能。 而且,网络末端的 S 形层用于二进制分类,并预测所提供的图像是真实的还是伪造的。 最后一层没有规范化层,但是其他层使用批处理规范化输入。
判别器网络主要镜像生成器网络。 一个重要的区别是它使用中的 LeakyReLU 代替了 ReLU 作为激活功能。 而且,网络末端的 S 形层用于二进制分类,并预测所提供的图像是真实的还是伪造的。 最后一层没有规范化层,但是其他层使用批处理规范化输入。
...
...
@@ -128,7 +128,7 @@ A fully convolutional network is a network without fully connected dense layers
到目前为止,我们已经针对不同的用例实现了不同的 GAN 网络。 条件 GAN 扩展了普通 GAN 的概念,并允许我们控制发电机网络的输出。 面部衰老就是在不更改身份的情况下更改一个人的面部年龄。 在大多数其他模型(包括 GAN)中,由于不考虑面部表情和面部配件(例如太阳镜或胡须),因此会使人的外观或身份损失 50%。 Age-cGAN 会考虑所有这些属性。 在本节中,我们将探索用于面部衰老的 cGAN。
到目前为止,我们已经针对不同的用例实现了不同的 GAN 网络。 条件 GAN 扩展了普通 GAN 的概念,并允许我们控制发电机网络的输出。 面部老化就是在不更改身份的情况下更改一个人的面部年龄。 在大多数其他模型(包括 GAN)中,由于不考虑面部表情和面部配件(例如太阳镜或胡须),因此会使人的外观或身份损失 50%。 Age-cGAN 会考虑所有这些属性。 在本节中,我们将探索用于面部老化的 cGAN。
...
...
@@ -34,7 +34,7 @@
cGAN 是 GAN 的一种,它取决于一些额外的信息。 我们将额外的`y`信息作为额外的输入层提供给生成器。 在香草 GAN 中,无法控制所生成图像的类别。 当我们向生成器添加条件`y`时,我们可以使用`y`生成特定类别的图像,该图像可以是任何类型的数据,例如类标签或整数数据 。 Vanilla GAN 只能学习一个类别,而为多个类别构造 GAN 则非常困难。 但是,可以使用 cGAN 生成针对不同类别具有不同条件的多模式模型。
cGAN 是 GAN 的一种,它取决于一些额外的信息。 我们将额外的`y`信息作为额外的输入层提供给生成器。 在朴素 GAN 中,无法控制所生成图像的类别。 当我们向生成器添加条件`y`时,我们可以使用`y`生成特定类别的图像,该图像可以是任何类型的数据,例如类标签或整数数据 。 Vanilla GAN 只能学习一个类别,而为多个类别构造 GAN 则非常困难。 但是,可以使用 cGAN 生成针对不同类别具有不同条件的多模式模型。
CNN 在计算机视觉任务中非常出色,无论是用于分类图像还是检测图像中的对象。 CNN 善于理解图像,以至于激发研究人员在 GAN 网络中使用 CNN。 最初,GAN 官方论文的作者介绍了仅具有密集层的**深层神经网络**(**DNN**)。 在 GAN 网络的原始实现中未使用卷积层。 在以前的 GAN 中,生成器和鉴别器网络仅使用密集的隐藏层。 相反,作者建议在 GAN 设置中可以使用不同的神经网络体系结构。
CNN 在计算机视觉任务中非常出色,无论是用于分类图像还是检测图像中的对象。 CNN 善于理解图像,以至于激发研究人员在 GAN 网络中使用 CNN。 最初,GAN 官方论文的作者介绍了仅具有密集层的**深层神经网络**(**DNN**)。 在 GAN 网络的原始实现中未使用卷积层。 在以前的 GAN 中,生成器和判别器网络仅使用密集的隐藏层。 相反,作者建议在 GAN 设置中可以使用不同的神经网络体系结构。
为了将照片变成一幅画或一幅画,再将它们变成照片,普通 GAN 需要一对图像。 CycleGAN 是一种 GAN 网络,可以将图像从一个域 X 转换为另一个域 Y,而无需配对图像。 CycleGAN 尝试学习发电机网络,而发电机网络又学习了两个映射。 CycleGAN 无需训练大多数 GAN 中使用的单个发电机网络,而是训练两个发电机和两个鉴别器网络。
为了将照片变成一幅画或一幅画,再将它们变成照片,普通 GAN 需要一对图像。 CycleGAN 是一种 GAN 网络,可以将图像从一个域 X 转换为另一个域 Y,而无需配对图像。 CycleGAN 尝试学习发电机网络,而发电机网络又学习了两个映射。 CycleGAN 无需训练大多数 GAN 中使用的单个发电机网络,而是训练两个发电机和两个判别器网络。
The ZeroPadding2D layer adds rows and columns of zeros at the top, bottom, left, and right of an image tensor.
...
...
@@ -181,7 +181,7 @@ The ZeroPadding2D layer adds rows and columns of zeros at the top, bottom, left,
![](img/f278fd84-eb49-4d88-a98e-31396fe4ea3a.png)
在此,x 是来自分布 A 的一个域的图像,y 是来自分布 B 的另一个域的图像。鉴别符![](img/c420501d-952a-4e5b-84b0-0aa891624a10.png)试图区分 G 映射(![](img/e57cd8de-afc5-4e00-a0d4-b87786d7318f.png))生成的图像和实数 图像 y 来自不同的分布 B。鉴别器![](img/e0cef545-08a1-4089-a238-9b6945c1d821.png)试图区分 F 映射生成的图像(![](img/968121df-410e-4bff-9e76-57d447e34db5.png))和来自分布 A 的真实图像 x。G 的目的是使对抗损失函数最小 对抗对手 D,后者不断尝试使其最大化。
在此,x 是来自分布 A 的一个域的图像,y 是来自分布 B 的另一个域的图像。鉴别符![](img/c420501d-952a-4e5b-84b0-0aa891624a10.png)试图区分 G 映射(![](img/e57cd8de-afc5-4e00-a0d4-b87786d7318f.png))生成的图像和实数 图像 y 来自不同的分布 B。判别器![](img/e0cef545-08a1-4089-a238-9b6945c1d821.png)试图区分 F 映射生成的图像(![](img/968121df-410e-4bff-9e76-57d447e34db5.png))和来自分布 A 的真实图像 x。G 的目的是使对抗损失函数最小 对抗对手 D,后者不断尝试使其最大化。
...
...
@@ -219,13 +219,13 @@ The ZeroPadding2D layer adds rows and columns of zeros at the top, bottom, left,
![](img/b72c39e8-2d9b-487b-83df-3b73ab2c550f.png)
在此,![](img/a04311c3-8eb2-45e2-98c0-e691deb818e0.png)是第一个对抗性损失,![](img/c9de7008-1df0-4381-92f5-fcfc5aa276a3.png)是第二个对抗性损失。 在生成器 A 和鉴别器 B 上计算第一个对抗损失。在生成器 B 和鉴别器 A 上计算第二个对抗损失。
在此,![](img/a04311c3-8eb2-45e2-98c0-e691deb818e0.png)是第一个对抗性损失,![](img/c9de7008-1df0-4381-92f5-fcfc5aa276a3.png)是第二个对抗性损失。 在生成器 A 和判别器 B 上计算第一个对抗损失。在生成器 B 和判别器 A 上计算第二个对抗损失。
SOM 是基于大脑特定区域功能的结构,该结构迫使其特定单元学习输入样本的特定特征。 这样的模型会自动进行自我组织,从而使响应相似模式的单位更加接近。 一旦提供了一个新样本,就足以计算获胜单位,该单位的权重与样本的距离最短; 并且在贴标过程之后,可以立即了解引起响应的特征(例如,垂直线或高级特征,例如是否有眼镜或胡须或脸部形状)。
GAN 是学习生成类似于真实数据或训练集中数据的神经网络。 GAN 的关键思想是让生成器网络和鉴别器网络相互竞争:生成器试图生成看起来像真实数据的数据,而鉴别器试图分辨生成的数据是否真实(从已知实数 数据)或伪造(由生成器生成)。 生成器和鉴别器是一起训练的,在训练过程中,生成器学会生成看起来越来越像真实数据的数据,而鉴别器则学会将真实数据与伪数据区分开。 生成器通过尝试使鉴别器的输出概率为真实数据来学习,当将生成器的输出作为鉴别器的输入时,生成器的输出概率尽可能接近 1.0,而鉴别器通过尝试实现两个目标来学习:
GAN 是学习生成类似于真实数据或训练集中数据的神经网络。 GAN 的关键思想是让生成器网络和判别器网络相互竞争:生成器试图生成看起来像真实数据的数据,而判别器试图分辨生成的数据是否真实(从已知实数 数据)或伪造(由生成器生成)。 生成器和判别器是一起训练的,在训练过程中,生成器学会生成看起来越来越像真实数据的数据,而判别器则学会将真实数据与伪数据区分开。 生成器通过尝试使判别器的输出概率为真实数据来学习,当将生成器的输出作为判别器的输入时,生成器的输出概率尽可能接近 1.0,而判别器通过尝试实现两个目标来学习:
* 当以发电机的输出作为输入时,使其输出的可能性为实,尽可能接近 0.0,这恰好是发电机的相反目标
* 当输入真实数据作为输入时,使其输出的可能性为实数,尽可能接近 1.0
In the next section, you'll see a detailed code snippet that matches the given description of the generator and the discriminator networks and their training process. If you feel like understanding more about GANs, in addition to our summary overview here, you can search for *"Introduction to GANs"* on YouTube and watch Ian Goodfellow's introduction and tutorial videos on GAN at NIPS (Neural Information Processing Systems) Conference 2016 and ICCV (International Conference on Computer Vision) 2017\. In fact, there are 7 NIPS 2016 Workshop on Adversarial Training videos and 12 ICCV 2017 GAN Tutorial videos on YouTube that you can immerse yourself in.
If you're interested in knowing more about the Nash Equilibrium, Google *"khan academy nash equilibrium"* and watch the two fun videos on it by Sal Khan. The Wikipedia page on Nash Equilibrium and the article, *"**What is the Nash equilibrium and why does it matter?"* in The Economist explaining economics ([https://www.economist.com/blogs/economist-explains/2016/09/economist-explains-economics](https://www.economist.com/blogs/economist-explains/2016/09/economist-explains-economics)) are also a good read. Understanding the basic intuition and idea behind GANs will help you appreciate more why it has great potential.
...
...
@@ -43,9 +43,9 @@ If you're interested in knowing more about the Nash Equilibrium, Google *"khan a
* 撰写看起来像真实新闻的新闻文章
* 生成与训练集中的音频相似的音频波形
基本上,GAN 可以从随机输入生成逼真的图像,文本或音频数据; 如果您具有一组源数据和目标数据的训练集,则 GAN 还可从类似于源数据的输入中生成类似于目标数据的数据。 GAN 模型中的生成器和鉴别器以动态方式工作的这一通用特性,使 GAN 可以生成任何种类的现实输出,这使 GAN 十分令人兴奋。
基本上,GAN 可以从随机输入生成逼真的图像,文本或音频数据; 如果您具有一组源数据和目标数据的训练集,则 GAN 还可从类似于源数据的输入中生成类似于目标数据的数据。 GAN 模型中的生成器和判别器以动态方式工作的这一通用特性,使 GAN 可以生成任何种类的现实输出,这使 GAN 十分令人兴奋。
但是,由于生成器和鉴别器的动态或竞争目标,训练 GAN 达到 Nash 平衡状态是一个棘手且困难的问题。 实际上,这仍然是一个开放的研究问题–伊恩·古德费洛(Ian Goodfellow)在 2017 年 8 月对安德鲁·伍(Andrew Ng)进行的*深度学习英雄*采访中(YouTube 上的搜索 *ian goodfellow andrew ng* )说,如果我们 可以使 GAN 变得像深度学习一样可靠,我们将看到 GAN 取得更大的成功,否则我们最终将用其他形式的生成模型代替它们。
但是,由于生成器和判别器的动态或竞争目标,训练 GAN 达到 Nash 平衡状态是一个棘手且困难的问题。 实际上,这仍然是一个开放的研究问题–伊恩·古德费洛(Ian Goodfellow)在 2017 年 8 月对安德鲁·伍(Andrew Ng)进行的*深度学习英雄*采访中(YouTube 上的搜索 *ian goodfellow andrew ng* )说,如果我们 可以使 GAN 变得像深度学习一样可靠,我们将看到 GAN 取得更大的成功,否则我们最终将用其他形式的生成模型代替它们。
尽管在 GAN 的培训方面存在挑战,但是在培训期间您已经可以应用[许多有效的已知技巧](https://github.com/soumith/ganhacks) – 我们在这里不会介绍它们,但是如果您有兴趣调整我们将在本章中描述的模型或[许多其他 GAN 模型](https://github.com/eriklindernoren/Keras-GAN) ),或构建自己的 GAN 模型。
...
...
@@ -69,7 +69,7 @@ If you're interested in knowing more about the Nash Equilibrium, Google *"khan a
手写数字的训练模型基于[仓库](https://github.com/jeffxtang/generative-adversarial-networks),这是[这个页面](https://github.com/jonbruner/generative-adversarial-networks)的分支,并添加了显示生成的数字并使用输入占位符保存 TensorFlow 训练模型的脚本,因此我们的 iOS 和 Android 应用程序可以使用该模型。 是的您应该查看[原始仓库的博客](https://www.oreilly.com/learning/generative-adversarial-networks-for-beginners)。在继续之前,需要对具有代码的 GAN 模型有基本的了解。
在研究定义生成器和鉴别器网络并进行 GAN 训练的核心代码片段之前,让我们先运行脚本以在克隆存储库并转到 repo 目录之后训练和测试模型:
在研究定义生成器和判别器网络并进行 GAN 训练的核心代码片段之前,让我们先运行脚本以在克隆存储库并转到 repo 目录之后训练和测试模型:
@@ -541,7 +541,7 @@ No OpKernel was registered to support Op 'FIFOQueueV2' with these attrs. Registe
![](img/0e0f47b1-2efa-4ec0-9eaa-4b21356cad23.png)Figure 9.3: Showing GAN model selection and results of generated handwritten digits
这些数字看起来很像真实的人类手写数字,都是在训练了基本 GAN 模型之后完成的。 如果您返回并查看进行训练的代码,并且停下来思考一下 GAN 的工作原理,一般来说,则生成器和鉴别器如何相互竞争,以及 尝试达到稳定的 Nash 平衡状态,在这种状态下,生成器可以生成区分器无法分辨出真实还是伪造的真实假数据,您可能会更欣赏 GAN 的魅力。
这些数字看起来很像真实的人类手写数字,都是在训练了基本 GAN 模型之后完成的。 如果您返回并查看进行训练的代码,并且停下来思考一下 GAN 的工作原理,一般来说,则生成器和判别器如何相互竞争,以及 尝试达到稳定的 Nash 平衡状态,在这种状态下,生成器可以生成区分器无法分辨出真实还是伪造的真实假数据,您可能会更欣赏 GAN 的魅力。
在本章中,我们快速浏览了 GAN 的美好世界。 我们介绍了 GAN 的含义以及它们为何如此有趣的原因-生成器和鉴别器相互竞争并尝试击败的方式听起来对大多数人来说很有吸引力。 然后,我们详细介绍了如何训练基本 GAN 模型和更高级的图像分辨率增强模型以及如何为移动设备准备它们的详细步骤。 最后,我们向您展示了如何使用这些模型构建 iOS 和 Android 应用程序。 如果您对整个过程和结果感到兴奋,那么您肯定会想进一步探索 GAN,这是一个快速发展的领域,在该领域中,新型 GAN 已经迅速开发出来,以克服先前模型的缺点; 例如,正如我们在*增强图像分辨率*小节的 GAN 高级模型中看到的那样,开发了需要配对图像进行训练的 pix2pix 模型的同一位研究人员提出了一种称为 [CycleGAN](https://junyanz.github.io/CycleGAN) 的模型,删除了图像配对的要求。 如果您对我们生成的数字或增强的图像的质量不满意,则可能还应该进一步探索 GAN,以了解如何改进 GAN 模型。 正如我们之前提到的,GAN 仍很年轻,研究人员仍在努力稳定培训,如果可以稳定的话,将会取得更大的成功。 至少到目前为止,您已经获得了如何在移动应用中快速部署 GAN 模型的经验。 由您决定是关注最新,最出色的 GAN 并在移动设备上使用它们,还是暂时搁置您的移动开发人员的帽子,会全力以赴来构建新的或改进现有的 GAN 模型。
在本章中,我们快速浏览了 GAN 的美好世界。 我们介绍了 GAN 的含义以及它们为何如此有趣的原因-生成器和判别器相互竞争并尝试击败的方式听起来对大多数人来说很有吸引力。 然后,我们详细介绍了如何训练基本 GAN 模型和更高级的图像分辨率增强模型以及如何为移动设备准备它们的详细步骤。 最后,我们向您展示了如何使用这些模型构建 iOS 和 Android 应用程序。 如果您对整个过程和结果感到兴奋,那么您肯定会想进一步探索 GAN,这是一个快速发展的领域,在该领域中,新型 GAN 已经迅速开发出来,以克服先前模型的缺点; 例如,正如我们在*增强图像分辨率*小节的 GAN 高级模型中看到的那样,开发了需要配对图像进行训练的 pix2pix 模型的同一位研究人员提出了一种称为 [CycleGAN](https://junyanz.github.io/CycleGAN) 的模型,删除了图像配对的要求。 如果您对我们生成的数字或增强的图像的质量不满意,则可能还应该进一步探索 GAN,以了解如何改进 GAN 模型。 正如我们之前提到的,GAN 仍很年轻,研究人员仍在努力稳定培训,如果可以稳定的话,将会取得更大的成功。 至少到目前为止,您已经获得了如何在移动应用中快速部署 GAN 模型的经验。 由您决定是关注最新,最出色的 GAN 并在移动设备上使用它们,还是暂时搁置您的移动开发人员的帽子,会全力以赴来构建新的或改进现有的 GAN 模型。
如果 GAN 在深度学习社区中引起了极大的兴奋,那么 AlphaGo 在 2016 年和 2017 年击败最优秀的人类 GO 玩家的成就无疑令所有人都感到惊讶。 此外,在 2017 年 10 月,AlphaGo Zero(一种完全基于自学强化学习而无需任何人类知识的新算法)被推举为击败 AlphaGo 100-0,令人难以置信。 2017 年 12 月,与仅在 GO 游戏中定位的 AlphaGo 和 AlphaGo Zero 不同,AlphaZero(一种可在许多具有挑战性的领域实现*“超人表现”* 的算法)被发布。 在下一章中,我们将看到如何使用最新最酷的 AlphaZero 来构建和训练用于玩简单游戏的模型,以及如何在移动设备上运行该模型。