提交 118c1e3c 编写于 作者: W wizardforcel

2020-12-23 22:58:02

上级 2a113475
......@@ -606,7 +606,7 @@ LSTM 是计算上昂贵的模型。 在现代计算机上,我们最多可能
我们将通过加载先前活动中准备的数据集来开始。 我们使用`pandas`将数据集加载到内存中。
2. 使用Pandas将训练数据集加载到内存中,如下所示:
2. 使用 Pandas 将训练数据集加载到内存中,如下所示:
```py
train = pd.read_csv('data/train_dataset.csv')
......
......@@ -181,7 +181,7 @@ M.train(model_data[i*7:7*(40 + i) + 7])
$ jupyter notebook
```
2. 在浏览器中打开应用程序提供的URL,然后打开名为`Activity_8_Re_training_a_model_dynamically.ipynb`的 Jupyter 笔记本。
2. 在浏览器中打开应用程序提供的 URL,然后打开名为`Activity_8_Re_training_a_model_dynamically.ipynb`的 Jupyter 笔记本。
现在,我们将从`cryptonic: Model()`和`CoinMarketCap()`加载这两个类。 这些类有助于操纵模型的过程以及从网站 [CoinMarketCap](https://coinmarketcap.com/) 获取数据的过程。
......
# 前言
《Python 元学习实用指南》解释了元学习的基础知识,并帮助您了解元学习的概念。 您将经历各种一次性学习算法,例如连体,原型,关系和内存增强网络,并在 TensorFlow 和 Keras 中实现它们。 您还将了解最新的元学习算法,例如与模型无关的元学习(MAML),Reptile和通过元学习进行快速上下文适应(CAML)。 然后,您将探索如何使用 meta-SGD 快速学习,并发现如何使用元学习进行无监督学习。
《Python 元学习实用指南》解释了元学习的基础知识,并帮助您了解元学习的概念。 您将经历各种一次性学习算法,例如连体,原型,关系和内存增强网络,并在 TensorFlow 和 Keras 中实现它们。 您还将了解最新的元学习算法,例如与模型无关的元学习(MAML),Reptile 和通过元学习进行快速上下文适应(CAML)。 然后,您将探索如何使用 meta-SGD 快速学习,并发现如何使用元学习进行无监督学习。
# 这本书是给谁的
......
# 元 SGD 和Reptile
# 元 SGD 和 Reptile
在上一章中,我们学习了如何使用 MAML 查找可在多个任务中推广的最佳参数。 我们看到了 MAML 如何通过计算元梯度和执行元优化来计算此最佳参数。 我们还看到了对抗性元学习,它通过添加对抗性样本并使 MAML 在干净样本和对抗性样本之间进行搏斗以找到最佳参数,从而增强了 MAML。 我们还看到了 CAML,或者说是元学习的上下文适应。 在本章中,我们将学习 Meta-SGD,这是另一种用于快速执行学习的元学习算法。 与 MAML 不同,Meta-SGD 不仅会找到最佳参数,还将找到最佳学习率和更新方向。 我们将看到如何在监督学习和强化学习设置中使用 Meta-SGD。 我们还将看到如何从头开始构建 Meta-SGD。 继续,我们将学习 Reptile 算法,该算法对 MAML 进行了改进。 我们将看到Reptile与 MAML 有何不同,然后将介绍如何在正弦波回归任务中使用Reptile。
在上一章中,我们学习了如何使用 MAML 查找可在多个任务中推广的最佳参数。 我们看到了 MAML 如何通过计算元梯度和执行元优化来计算此最佳参数。 我们还看到了对抗性元学习,它通过添加对抗性样本并使 MAML 在干净样本和对抗性样本之间进行搏斗以找到最佳参数,从而增强了 MAML。 我们还看到了 CAML,或者说是元学习的上下文适应。 在本章中,我们将学习 Meta-SGD,这是另一种用于快速执行学习的元学习算法。 与 MAML 不同,Meta-SGD 不仅会找到最佳参数,还将找到最佳学习率和更新方向。 我们将看到如何在监督学习和强化学习设置中使用 Meta-SGD。 我们还将看到如何从头开始构建 Meta-SGD。 继续,我们将学习 Reptile 算法,该算法对 MAML 进行了改进。 我们将看到 Reptile 与 MAML 有何不同,然后将介绍如何在正弦波回归任务中使用 Reptile。
在本章中,您将了解以下内容:
......@@ -9,7 +9,7 @@
* 强化学习中的 Meta-SGD
* 从头开始构建 Meta-SGD
* 爬虫
* 使用Reptile进行正弦波回归
* 使用 Reptile 进行正弦波回归
# 元 SGD
......@@ -424,7 +424,7 @@ Sampling Next Batch of Tasks
# 爬虫
Reptile算法已被 OpenAI 提出作为对 MAML 的改进。 它很容易实现。 我们知道,在 MAML 中,我们可以计算二阶导数,即梯度的梯度。 但是从计算上来说,这不是一个有效的任务。 因此,OpenAI 提出了对 MAML 的改进,称为 Reptile。 Reptile的算法非常简单。 对一些`n`个任务进行采样,然后运行**随机梯度下降****SGD**),以减少每个采样任务的迭代次数,然后沿某个方向更新模型参数 这是所有任务的共同点。 由于我们对每个任务执行的 SGD 迭代次数较少,因此间接暗示我们正在计算损失的二阶导数。 与 MAML 不同,它在计算上很有效,因为我们不直接计算二阶导数也不展开计算图,因此易于实现。
Reptile 算法已被 OpenAI 提出作为对 MAML 的改进。 它很容易实现。 我们知道,在 MAML 中,我们可以计算二阶导数,即梯度的梯度。 但是从计算上来说,这不是一个有效的任务。 因此,OpenAI 提出了对 MAML 的改进,称为 Reptile。 Reptile 的算法非常简单。 对一些`n`个任务进行采样,然后运行**随机梯度下降****SGD**),以减少每个采样任务的迭代次数,然后沿某个方向更新模型参数 这是所有任务的共同点。 由于我们对每个任务执行的 SGD 迭代次数较少,因此间接暗示我们正在计算损失的二阶导数。 与 MAML 不同,它在计算上很有效,因为我们不直接计算二阶导数也不展开计算图,因此易于实现。
假设我们从任务分布中采样了两个任务![](img/c5ea074d-c6d3-4b6e-aa5b-0f7c2f52e9c6.png)和![](img/ca55535c-9882-4e53-9c2c-784ecb577915.png),并随机初始化了模型参数![](img/f10d9828-d108-4808-bd3c-e68186827601.png)。 首先,我们接受任务![](img/0760630d-8894-43e4-bc70-89dd8c449426.png)并对某些`n`次迭代执行 SGD,并获得最佳参数![](img/65859715-81b5-44c1-ab58-59f1e43f0e89.png)。 然后我们执行下一个任务![](img/c8516922-7cdd-40e2-b27f-b9f4de9c4878.png),迭代执行 SGD `n`次,并获得最佳参数![](img/90700324-178a-4cbd-b9e9-f900eb70d5b8.png)。 因此,我们有两个最佳参数集:![](img/454789fc-30c8-40d0-93db-eafdedb42ee3.png)。 现在,我们需要沿更靠近这两个最佳参数的方向移动参数![](img/8cd84028-bd5a-49ba-a7b1-25e560c54242.png),如下图所示:
......@@ -444,9 +444,9 @@ Reptile算法已被 OpenAI 提出作为对 MAML 的改进。 它很容易实现
通过使用先前的方程式更新模型参数![](img/47390d06-630c-4f20-8056-53d429f0a481.png),我们实质上使初始参数![](img/75b7f6c8-70f4-42dd-858d-70dde8dfe491.png)与最佳参数值![](img/ae0a1864-b5e4-4f9b-809c-a13f3479b160.png)之间的距离最小。 因此,我们通过执行`n`次迭代的 SGD,找到每个任务的最佳参数。 一旦获得了最佳参数集,就可以使用先前的公式更新模型参数![](img/9f561532-510a-4ed1-a29a-897214fef478.png)
# Reptile算法
# Reptile 算法
Reptile是一种简单而有效的算法。 Reptile可以实现串行和批量版本。 在串行版本中,我们仅从任务分发中抽样一个任务,而在批量版本中,我们对一批任务进行抽样并尝试找到最佳参数。 我们将看到 Reptile 的串行版本如何工作。 Reptile所涉及的步骤顺序如下:
Reptile 是一种简单而有效的算法。 Reptile 可以实现串行和批量版本。 在串行版本中,我们仅从任务分发中抽样一个任务,而在批量版本中,我们对一批任务进行抽样并尝试找到最佳参数。 我们将看到 Reptile 的串行版本如何工作。 Reptile 所涉及的步骤顺序如下:
1. 假设我们有任务![](img/1024a056-8186-4c04-96dd-c60de2fd985b.png)的分布,并且我们随机初始化模型参数![](img/91b92f8b-de9b-42fc-866c-4aef6f620f33.png)
2. 现在我们从任务分配![](img/a7a4e492-c505-4001-bd7c-48007efbf0f1.png)中抽取任务`T`
......@@ -454,9 +454,9 @@ Reptile是一种简单而有效的算法。 Reptile可以实现串行和批量
4. 我们在更接近先前步骤中获得的最佳参数![](img/141894b2-a04b-437c-9c95-5d5383e843db.png)的方向上更新了随机初始化的参数![](img/b4401cb9-039f-41b0-8fc8-1e763d8a62ea.png)如下:![](img/2b8e090c-d4e8-4fa2-8944-112842f649a5.png)
5. 对于`n`迭代次数,我们重复步骤 2 到步骤 4。
# 使用Reptile进行正弦波回归
# 使用 Reptile 进行正弦波回归
在上一节中,我们了解了Reptile的工作原理。 现在,我们将从头开始对 Reptile 进行编码,从而更好地理解它。 假设我们有一个任务集合,每个任务的目标是在给定一些输入的情况下使正弦波的输出回归。 那是什么意思呢?
在上一节中,我们了解了 Reptile 的工作原理。 现在,我们将从头开始对 Reptile 进行编码,从而更好地理解它。 假设我们有一个任务集合,每个任务的目标是在给定一些输入的情况下使正弦波的输出回归。 那是什么意思呢?
假设`y = amplitude * sin(x + phase)`。 我们算法的目标是学习在给定`x`的情况下对`y`的值进行回归。 幅度的值在 0.1 到 5.0 之间随机选择,相位的值在 0 到![](img/21218cec-890b-4d1e-bca2-5f739aa42d55.png)之间随机选择。 因此,对于每个任务,我们仅采样 10 个数据点并训练网络-也就是说,对于每个任务,我们仅采样 10 个`(x, y)`对。 让我们看一下代码并详细查看它。
......@@ -497,7 +497,7 @@ def sample_points(k):
# 两层神经网络
像 MAML 一样,Reptile也与可以通过梯度下降训练的任何算法兼容。 因此,我们使用具有 64 个隐藏单元的简单两层神经网络。
像 MAML 一样,Reptile 也与可以通过梯度下降训练的任何算法兼容。 因此,我们使用具有 64 个隐藏单元的简单两层神经网络。
首先,让我们重置 TensorFlow 图:
......@@ -562,7 +562,7 @@ init = tf.global_variables_initializer()
# 爬虫
现在,我们将看到如何使用Reptile找到神经网络的最佳参数。
现在,我们将看到如何使用 Reptile 找到神经网络的最佳参数。
首先,我们初始化必要的变量:
......@@ -763,7 +763,7 @@ Sampling Next Batch of Tasks
# 概要
在本章中,我们学习了 Meta-SGD 和 Reptile 算法。 我们看到了 Meta-SGD 与 MAML 有何不同,以及如何在监督学习和强化学习设置中使用 Meta-SGD。 我们看到了 Meta-SGD 如何学习模型参数以及学习率和更新方向。 我们还了解了如何从头开始构建 Meta-SGD。 然后,我们了解了Reptile算法。 我们看到了 Reptile 与 MAML 的不同之处,以及 Reptile 对 MAML 算法的改进。 我们还学习了如何在正弦波回归任务中使用Reptile。
在本章中,我们学习了 Meta-SGD 和 Reptile 算法。 我们看到了 Meta-SGD 与 MAML 有何不同,以及如何在监督学习和强化学习设置中使用 Meta-SGD。 我们看到了 Meta-SGD 如何学习模型参数以及学习率和更新方向。 我们还了解了如何从头开始构建 Meta-SGD。 然后,我们了解了 Reptile 算法。 我们看到了 Reptile 与 MAML 的不同之处,以及 Reptile 对 MAML 算法的改进。 我们还学习了如何在正弦波回归任务中使用 Reptile。
在下一章中,我们将学习如何将梯度一致性用作元学习中的优化目标。
......@@ -772,8 +772,8 @@ Sampling Next Batch of Tasks
1. Meta-SGD 与 MAML 有何不同?
2. Meta-SGD 如何找到最佳学习率?
3. meta-SGD 中学习率的更新方程是什么?
4. Reptile算法如何工作?
5. Reptile算法的更新方程是什么?
4. Reptile 算法如何工作?
5. Reptile 算法的更新方程是什么?
# 进一步阅读
......
# 梯度协议作为优化目标
在上一章中,我们了解了 Meta-SGD 和Reptile算法。 我们看到了如何使用 Meta-SGD 查找最佳参数,最佳学习率和梯度更新方向。 我们还看到了 Reptile 算法的工作原理以及比 MAML 更有效的方法。 在本章中,我们将学习如何将梯度一致性用作元学习的优化目标。 正如您在 MAML 中所看到的,我们基本上是对各个任务的梯度进行平均,并更新模型参数。 在梯度一致性算法中,我们将对梯度进行加权平均以更新模型参数,并且我们将了解如何为梯度添加权重如何帮助我们找到更好的模型参数。 在本章中,我们将确切探讨梯度一致性算法的工作原理。 我们的梯度协议算法可以同时插入 MAML 和 Reptile 算法。 我们还将从头开始了解如何在 MAML 中实现梯度协议。
在上一章中,我们了解了 Meta-SGD 和 Reptile 算法。 我们看到了如何使用 Meta-SGD 查找最佳参数,最佳学习率和梯度更新方向。 我们还看到了 Reptile 算法的工作原理以及比 MAML 更有效的方法。 在本章中,我们将学习如何将梯度一致性用作元学习的优化目标。 正如您在 MAML 中所看到的,我们基本上是对各个任务的梯度进行平均,并更新模型参数。 在梯度一致性算法中,我们将对梯度进行加权平均以更新模型参数,并且我们将了解如何为梯度添加权重如何帮助我们找到更好的模型参数。 在本章中,我们将确切探讨梯度一致性算法的工作原理。 我们的梯度协议算法可以同时插入 MAML 和 Reptile 算法。 我们还将从头开始了解如何在 MAML 中实现梯度协议。
在本章中,我们将学习以下内容:
......@@ -33,7 +33,7 @@
它暗示,如果任务的梯度与采样的一批任务中所有任务的平均梯度在同一方向上,则我们可以增加其权重,以便为更新模型参数做出更大的贡献。 同样,如果任务的梯度方向与采样的任务批次中所有任务的平均梯度方向大不相同,则我们可以降低其权重,以便在更新模型参数时贡献较小 。 我们将在下一节中看到如何精确计算这些权重。
我们不仅可以将梯度一致性算法应用于 MAML,还可以应用于 Reptile 算法。 因此,我们的Reptile更新方程如下:
我们不仅可以将梯度一致性算法应用于 MAML,还可以应用于 Reptile 算法。 因此,我们的 Reptile 更新方程如下:
![](img/bebd9e1c-97f8-40ca-9cd6-d5dbec4a7089.png)
......@@ -102,7 +102,7 @@ for i in range(num_tasks):
![](img/08fceae6-5556-4b67-9608-d9d7917f7728.png)
如果我们的元学习算法是Reptile,则更新方程如下:
如果我们的元学习算法是 Reptile,则更新方程如下:
![](img/9460948f-613a-4058-b2b7-674db9b719bc.png)
......
......@@ -70,14 +70,14 @@
5. 上下文参数是特定于任务的参数,该参数在内部循环中更新。 用 denoted 表示,它特定于每个任务,代表单个任务的嵌入。
6. 共享参数在任务之间共享,并在外循环中更新以找到最佳模型参数。 用θ表示。
# 第 7 章:Meta-SGD 和Reptile算法
# 第 7 章:Meta-SGD 和 Reptile 算法
1. 与 MAML 不同,在 Meta-SGD 中,除了找到最佳参数值![](img/bc332532-036a-41fa-8960-6617759f1a29.png)之外,我们还找到最佳学习率![](img/455b90b1-5a66-4143-a4bc-30031eba9969.png)并更新方向。
2. 学习率在适应项中隐式实现。 因此,在 Meta-SGD 中,我们不会以较小的标量值初始化学习率。 相反,我们使用与![](img/f4d705b6-6a27-43af-9987-650463402393.png)相同形状的随机值初始化它们,然后与![](img/48af46b5-42f6-4af5-b115-3182de1bb664.png)一起学习它们。
3. 学习率的更新公式可以表示为![](img/b41f82a1-d32d-4c12-ac8d-a07e86ef0f59.png)
4.`n`个任务进行采样,并在每个采样任务上以较少的迭代次数运行 SGD,然后按照所有任务共有的方向更新模型参数。
5. Reptile更新方程可表示为![](img/6bdc020a-39a6-4c37-906f-23dde9efaecd.png)
5. Reptile 更新方程可表示为![](img/6bdc020a-39a6-4c37-906f-23dde9efaecd.png)
# 第 8 章:梯度协议作为优化目标
......
......@@ -152,7 +152,7 @@ RL-Glue 提供了一个接口,用于将代理,环境和程序连接在一起
# ViZDoom
顾名思义,ViZDoom 是一个基于Doom的 AI 平台。 它为多代理提供支持,并提供竞争环境来测试代理。 但是,ViZDoom 仅支持 Doom 游戏环境。 它提供了屏幕外渲染以及单人和多人游戏支持。
顾名思义,ViZDoom 是一个基于 Doom 的 AI 平台。 它为多代理提供支持,并提供竞争环境来测试代理。 但是,ViZDoom 仅支持 Doom 游戏环境。 它提供了屏幕外渲染以及单人和多人游戏支持。
# RL 的应用
......
......@@ -385,7 +385,7 @@ with tf.Session() as sess:
# RNN
鸟儿在____中飞翔。 如果我要求您预测空白,则可能会预测“天空”。 您如何预测“天空”一词会很好地填补这一空白? 因为您阅读了整个句子并根据理解句子的上下文,预测“天空”是正确的词。 如果我们要求正常的神经网络为该空格预测正确的单词,它将无法预测正确的单词。 这是因为正常神经网络的输出仅基于当前输入。 因此,神经网络的输入将只是前一个单词`the`。 也就是说,在正常的神经网络中,每个输入都彼此独立。 因此,在我们必须记住输入序列以预测下一个序列的情况下,它将不能很好地执行。
鸟儿在 ____ 中飞翔。 如果我要求您预测空白,则可能会预测“天空”。 您如何预测“天空”一词会很好地填补这一空白? 因为您阅读了整个句子并根据理解句子的上下文,预测“天空”是正确的词。 如果我们要求正常的神经网络为该空格预测正确的单词,它将无法预测正确的单词。 这是因为正常神经网络的输出仅基于当前输入。 因此,神经网络的输入将只是前一个单词`the`。 也就是说,在正常的神经网络中,每个输入都彼此独立。 因此,在我们必须记住输入序列以预测下一个序列的情况下,它将不能很好地执行。
我们如何使我们的网络记住整个句子以正确预测下一个单词? 这是 RNN 发挥作用的地方。 RNN 不仅基于当前输入,而且还基于先前的隐藏状态来预测输出。 您可能想知道为什么 RNN 必须基于当前输入和先前的隐藏状态来预测输出,以及为什么它不能仅使用当前输入和先前的输入而不是当前输入和先前的隐藏状态来预测输出 。 这是因为前一个输入将存储有关前一个单词的信息,而前一个隐藏状态将捕获有关整个句子的信息,也就是说,前一个隐藏状态将存储上下文。 因此,基于当前输入和先前的隐藏状态而不是仅基于当前输入和先前的输入来预测输出非常有用。
......@@ -447,7 +447,7 @@ RNN 是一种特殊类型的神经网络,广泛应用于顺序数据。 换句
# 长短期记忆 RNN
RNN 非常酷,对吧? 但是我们在训练 RNN 时遇到了一个问题,即消失梯度问题。 让我们来探讨一下。 天空是__的。 RNN 可以根据所看到的信息轻松地将最后一个单词预测为“蓝色”。 但是 RNN 无法涵盖长期依赖关系。 这意味着什么? 假设 Archie 在中国生活了 20 年。 他喜欢听好音乐。 他是一个非常大的漫画迷。 他的__很流利。 现在,您将预测空白为中文。 您是如何预测的? 因为您了解 Archie 在中国生活了 20 年,所以您认为他可能会说流利的中文。 但是 RNN 不能在记忆中保留所有这些信息以说 Archie 能够说流利的中文。 由于消失的梯度问题,它无法长时间在内存中重新收集/记住信息。 我们该如何解决?
RNN 非常酷,对吧? 但是我们在训练 RNN 时遇到了一个问题,即消失梯度问题。 让我们来探讨一下。 天空是 __ 的。 RNN 可以根据所看到的信息轻松地将最后一个单词预测为“蓝色”。 但是 RNN 无法涵盖长期依赖关系。 这意味着什么? 假设 Archie 在中国生活了 20 年。 他喜欢听好音乐。 他是一个非常大的漫画迷。 他的 __ 很流利。 现在,您将预测空白为中文。 您是如何预测的? 因为您了解 Archie 在中国生活了 20 年,所以您认为他可能会说流利的中文。 但是 RNN 不能在记忆中保留所有这些信息以说 Archie 能够说流利的中文。 由于消失的梯度问题,它无法长时间在内存中重新收集/记住信息。 我们该如何解决?
LSTM 来了!!!!
......@@ -478,7 +478,7 @@ LSTM 单元称为内存,它们负责存储信息。 但是信息必须在存
* **输出门**:该输出门负责确定一次从单元状态`t`应该显示什么信息。 现在,考虑以下句子:
“Zayn 的首张专辑取得了巨大的成功。 恭喜____。”
“Zayn 的首张专辑取得了巨大的成功。 恭喜 ____。”
在这里,“恭喜”是用于形容名词的形容词。 输出层将预测`Zayn`(名词),以填补空白。
......
......@@ -44,7 +44,7 @@ pip install vizdoom
ViZDoom 提供了许多 Doom 方案,可以在软件包文件夹`vizdoom/scenarios`中找到这些方案。
# 基本Doom游戏
# 基本 Doom 游戏
在开始之前,让我们通过看一个基本示例来熟悉`vizdoom`环境:
......@@ -119,7 +119,7 @@ for i in range(no_of_episodes):
![](img/00289.jpeg)
# DRQN 的Doom
# DRQN 的 Doom
现在,让我们看看如何利用 DRQN 算法来训练我们的特工玩《毁灭战士》。 我们为成功杀死怪物分配正面奖励,为失去生命,自杀和失去弹药(子弹)分配负面奖励。 您可以在[这里](https://github.com/sudharsan13296/Hands-On-Reinforcement-Learning-With-Python/blob/master/09.%20Playing%20Doom%20Game%20using%20DRQN/9.5%20Doom%20Game%20Using%20DRQN.ipynb)获得 Jupyter 笔记本的完整代码及其解释。 本节中使用的代码的权利归于 [Luthanicus](https://github.com/Luthanicus/losaltoshackathon-drqn)
......
......@@ -87,7 +87,7 @@
1. DRQN 利用**循环神经网络****RNN**),其中 DQN 利用原始神经网络。
2. 当可以部分观察 MDP 时,不使用 DQN。
3. 请参阅“DRQN 的Doom”部分。
3. 请参阅“DRQN 的 Doom”部分。
4. 与 DRQN 不同,DARQN 利用注意力机制。
5. DARQN 用于理解和专注于游戏屏幕的特定区域,这一点更为重要。
6. 软硬注意。
......
......@@ -146,7 +146,7 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢
![](img/66329819-1528-4067-afc8-bf3e505ecb09.png)
将为LReLU 激活函数提供![](img/7e701921-1d53-4bbb-9ed7-e386eacc553c.png)参数,而对于参数 ReLU,![](img/21c3900a-a283-44ba-b15e-21d1faf0b243.png)是神经网络将通过训练学习的参数。 下图显示了LReLU 激活函数的输出:
将为 LReLU 激活函数提供![](img/7e701921-1d53-4bbb-9ed7-e386eacc553c.png)参数,而对于参数 ReLU,![](img/21c3900a-a283-44ba-b15e-21d1faf0b243.png)是神经网络将通过训练学习的参数。 下图显示了 LReLU 激活函数的输出:
![](img/908a6fec-a34a-4e27-a0a4-27dd3b5d84cc.png)
......
......@@ -282,7 +282,7 @@ def build_generator(self,image,reuse=False,name='generator'):
return out_img
```
在生成器函数中,我们定义了LReLU 激活函数,并使用`0.2`的泄漏因子。 我们还定义了卷积层生成函数`common_conv2d`(用于对图像进行下采样)和`common_deconv2d`(用于将经降采样的图像上采样至其原始空间尺寸)。
在生成器函数中,我们定义了 LReLU 激活函数,并使用`0.2`的泄漏因子。 我们还定义了卷积层生成函数`common_conv2d`(用于对图像进行下采样)和`common_deconv2d`(用于将经降采样的图像上采样至其原始空间尺寸)。
我们通过使用`tf.get_variable_scope().reuse_variables()`使用`reuse`选项定义生成器功能。 当多次调用同一个生成器函数时,重用选项可确保我们重用特定生成器使用的相同变量。 当我们删除重用选项时,我们为生成器创建了一组新的变量。
......@@ -300,7 +300,7 @@ def build_generator(self,image,reuse=False,name='generator'):
# DiscoGAN 的区别
DiscoGAN 的区分者将学会在特定域中将真实图像与假图像区分开。 我们将有两个鉴别符:一个用于域`A`,一个用于域`B`。这些鉴别器也是可以执行二进制分类的卷积网络。 与传统的基于分类的卷积网络不同,鉴别器没有任何全连接层。 使用步长为 2 的卷积对输入图像进行下采样,直到最终层(输出为`1 x 1`)为止。同样,我们使用LReLU 作为激活函数并使用批量归一化以实现稳定和快速的收敛。 以下代码显示了 TensorFlow 中鉴别器构建函数的实现:
DiscoGAN 的区分者将学会在特定域中将真实图像与假图像区分开。 我们将有两个鉴别符:一个用于域`A`,一个用于域`B`。这些鉴别器也是可以执行二进制分类的卷积网络。 与传统的基于分类的卷积网络不同,鉴别器没有任何全连接层。 使用步长为 2 的卷积对输入图像进行下采样,直到最终层(输出为`1 x 1`)为止。同样,我们使用 LReLU 作为激活函数并使用批量归一化以实现稳定和快速的收敛。 以下代码显示了 TensorFlow 中鉴别器构建函数的实现:
```py
def build_discriminator(self,image,reuse=False,name='discriminator'):
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册