提交 602cb693 编写于 作者: W wizardforcel

2020-12-22 22:55:34

上级 0a8f7014
......@@ -12,7 +12,7 @@ TensorFlow 是用于机器学习以及最近的深度学习的最受欢迎的架
第 1 课,“神经网络和深度学习简介”可帮助您设置和配置深度学习环境,并开始研究各个模型和案例研究。 它还讨论了神经网络及其思想及其起源,并探讨了其功能。
第 2 课,“模型体系结构”显示了如何使用深度学习模型预测比特币价格。
第 2 课,“模型构”显示了如何使用深度学习模型预测比特币价格。
第 3 课,“模型评估和优化”展示了如何评估神经网络模型。 我们将修改网络的超参数以提高其性能。
......
......@@ -47,7 +47,7 @@
### 注意
Google 研究博客,[《转换器:一种用于语言理解的新型神经网络体系结构》](https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html)。
Google 研究博客,[《转换器:一种用于语言理解的新型神经网络构》](https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html)。
* **自动驾驶汽车**:Uber,NVIDIA 和 Waymo 被认为正在使用深度学习模型来控制不同的控制驾驶的车辆功能。 每个公司都在研究多种可能性,包括使用人工训练网络,模拟在虚拟环境中驾驶的车辆,甚至创建类似于城市的小型环境,在其中可以根据预期和意外事件对车辆进行训练。
......@@ -158,7 +158,7 @@
本节为您提供了神经网络和深度学习的概述。 此外,我们讨论了入门者的直觉,以了解以下关键概念:
* 只要有足够的资源和数据,神经网络原则上就可以近似大多数功能。
* 层和节点是神经网络最重要的结构组件。 通常,人们会花费大量时间来更改这些组件以找到一种有效的体系结构。
* 层和节点是神经网络最重要的结构组件。 通常,人们会花费大量时间来更改这些组件以找到一种有效的构。
* 权重和偏差是网络在训练过程中“学习”的关键属性。
这些概念将在我们的下一部分中证明是有用的,因为我们探索了一个在现实世界中经过训练的神经网络,并进行了修改以训练自己的神经网络。
......@@ -379,7 +379,7 @@ CIFAR 数据集是机器学习数据集,其中包含按不同类别组织的
在这里,我们还有两个 TensorFlow 变量`W``B`。 请注意,这些变量的初始化非常简单:`W`被初始化为修剪后的高斯分布(修剪过`size_in``size_out`)的随机值,标准偏差为`0.1,``B`( 术语)初始化为`0.1`(常数)。 这两个值在每次运行期间都会不断变化。 该代码段执行两次,产生两个全连接网络-一个将数据传递到另一个。
那 11 行 Python 代码代表了我们完整的神经网络。 我们将在“第 2 课”,“模型体系结构”中详细介绍使用 Keras 的每个组件。 目前,应重点了解网络在每次运行时都会改变每个层中的`W``B`值,以及这些代码片段如何形成不同的层。 这 11 行 Python 是数十年来神经网络研究的高潮。
那 11 行 Python 代码代表了我们完整的神经网络。 我们将在“第 2 课”,“模型构”中详细介绍使用 Keras 的每个组件。 目前,应重点了解网络在每次运行时都会改变每个层中的`W``B`值,以及这些代码片段如何形成不同的层。 这 11 行 Python 是数十年来神经网络研究的高潮。
现在让我们训练该网络以评估其在 MNIST 数据集中的表现。
......@@ -480,7 +480,7 @@ $ tensorboard --logdir=mnist_example/
### 注意
您还可以在神经网络中修改许多其他参数。 现在,尝试网络的时代和学习率。 您会注意到,这两个功能可以极大地改变您网络的输出,但幅度却很大。 进行实验,看看是否可以通过更改这两个参数来使用当前体系结构更快地训练该网络。
您还可以在神经网络中修改许多其他参数。 现在,尝试网络的时代和学习率。 您会注意到,这两个功能可以极大地改变您网络的输出,但幅度却很大。 进行实验,看看是否可以通过更改这两个参数来使用当前构更快地训练该网络。
使用 TensorBoard 验证网络的训练方式。 通过将起始值乘以 10,再更改几次这些参数,直到您注意到网络正在改善。 调整网络并提高准确性的过程类似于当今工业应用中用于改进现有神经网络模型的过程。
......
......@@ -15,13 +15,13 @@
# 选择正确的模型架构
深度学习是一个正在进行大量研究活动的领域。 除其他外,研究人员致力于发明新的神经网络体系结构,该体系结构可以解决新问题或提高以前实现的体系结构的性能。
深度学习是一个正在进行大量研究活动的领域。 除其他外,研究人员致力于发明新的神经网络架构,该架构可以解决新问题或提高以前实现的架构的性能。
在本节中,我们将研究新旧架构。 较旧的体系结构已用于解决大量问题,并且在开始新项目时通常被认为是正确的选择。 较新的体系结构已在特定问题上取得了巨大的成功,但很难一概而论。 后者很有趣,可以作为下一步探索的参考,但在启动项目时并不是一个好的选择。
在本节中,我们将研究新旧架构。 较旧的架构已用于解决大量问题,并且在开始新项目时通常被认为是正确的选择。 较新的架构已在特定问题上取得了巨大的成功,但很难一概而论。 后者很有趣,可以作为下一步探索的参考,但在启动项目时并不是一个好的选择。
## 通用架构
考虑到有许多种可能的架构,经常被用作两种应用的两种流行架构:**卷积神经网络****CNN**)和 **循环神经网络****RNN**)。 这些是基本的网络,应该被视为大多数项目的起点。 由于它们在该领域中的相关性,我们还包括了另外三个网络的描述: **RNN 变体的长短期记忆****LSTM**)网络; **生成对抗网络****GAN**); 和深度强化学习。 后面的这些体系结构在解决当代问题方面取得了巨大的成功,但是使用起来有些困难。
考虑到有许多种可能的架构,经常被用作两种应用的两种流行架构:**卷积神经网络****CNN**)和 **循环神经网络****RNN**)。 这些是基本的网络,应该被视为大多数项目的起点。 由于它们在该领域中的相关性,我们还包括了另外三个网络的描述: **RNN 变体的长短期记忆****LSTM**)网络; **生成对抗网络****GAN**); 和深度强化学习。 后面的这些构在解决当代问题方面取得了巨大的成功,但是使用起来有些困难。
### 卷积神经网络
......@@ -41,7 +41,7 @@ CNN 的基本见解是将紧密相关的数据用作培训过程的要素,而
### 循环神经网络
卷积神经网络与一组输入一起工作,这些输入不断改变网络各个层和节点的权重和偏差。 这种方法的一个已知局限性是,在确定如何更改网络的权重和偏差时,其体系结构会忽略这些输入的顺序。
卷积神经网络与一组输入一起工作,这些输入不断改变网络各个层和节点的权重和偏差。 这种方法的一个已知局限性是,在确定如何更改网络的权重和偏差时,其构会忽略这些输入的顺序。
专门创建了循环神经网络来解决该问题。 RNN 旨在处理顺序数据。 这意味着在每个时期,各层都会受到先前层的输出的影响。 给定序列中的先前观测值的记忆在后验观测值的评估中起作用。
......@@ -49,7 +49,7 @@ CNN 的基本见解是将紧密相关的数据用作培训过程的要素,而
### 注意
有关更多信息,请参阅 Jakob Uszkoreit 撰写的[《变压器:一种用于语言理解的新型神经网络体系结构》](https://research.googleblog.com/2017/08/transformer-novel-neural-network.html)
有关更多信息,请参阅 Jakob Uszkoreit 撰写的[《变压器:一种用于语言理解的新型神经网络构》](https://research.googleblog.com/2017/08/transformer-novel-neural-network.html)
![Recurrent Neural Networks](img/image02_02.jpg)
......@@ -61,7 +61,7 @@ CNN 的基本见解是将紧密相关的数据用作培训过程的要素,而
### 注意
有关更多详细信息,请参见 1997 年 Sepp Hochreiter 和 JürgenSchmidhuber 首次引入 LSTM 体系结构。当前的实现已进行了一些修改。 有关 LSTM 每个组件如何工作的详细数学解释,我们建议克里斯托弗·奥拉(Christopher Olah)于 2015 年 8 月发表的文章[《了解 LSTM 网络》](http://colah.github.io/posts/2015-08-Understanding-LSTMs/)
有关更多详细信息,请参见 1997 年 Sepp Hochreiter 和 JürgenSchmidhuber 首次引入 LSTM 构。当前的实现已进行了一些修改。 有关 LSTM 每个组件如何工作的详细数学解释,我们建议克里斯托弗·奥拉(Christopher Olah)于 2015 年 8 月发表的文章[《了解 LSTM 网络》](http://colah.github.io/posts/2015-08-Understanding-LSTMs/)
### 生成对抗网络
......@@ -117,7 +117,7 @@ GAN 已成功用于数据具有清晰拓扑结构的领域。 它的原始实现
| 生成对抗网络(GAN) | 网格状的拓扑结构(即图像) | 图像生成 |
| 深度强化学习(DRL) | 规则明确,奖励功能明确的系统 | 玩电子游戏和自动驾驶汽车 |
> 表 1:不同的神经网络体系结构已在不同领域取得成功。 网络的体系结构通常与当前问题的结构有关。
> 表 1:不同的神经网络架构已在不同领域取得成功。 网络的架构通常与当前问题的结构有关。
## 数据标准化
......@@ -323,7 +323,7 @@ bitcoin_recent.to_csv('data/bitcoin_recent.csv', index=False)
# 使用 Keras 作为 TensorFlow 接口
本节重点介绍 Keras。 我们之所以使用 Keras,是因为它将 TensorFlow 接口简化为通用抽象。 在后端,计算仍然在 TensorFlow 中执行,并且仍然使用 TensorFlow 组件构建图形,但是界面要简单得多。 我们花费较少的时间来担心诸如变量和运算之类的各个组件,而花费更多的时间将网络构建为计算单元。 Keras 使您可以轻松地尝试不同的体系结构和超参数,从而更快地向高性能解决方案迈进。
本节重点介绍 Keras。 我们之所以使用 Keras,是因为它将 TensorFlow 接口简化为通用抽象。 在后端,计算仍然在 TensorFlow 中执行,并且仍然使用 TensorFlow 组件构建图形,但是界面要简单得多。 我们花费较少的时间来担心诸如变量和运算之类的各个组件,而花费更多的时间将网络构建为计算单元。 Keras 使您可以轻松地尝试不同的构和超参数,从而更快地向高性能解决方案迈进。
从 TensorFlow 1.4.0(2017 年 11 月)开始,Keras 现在以 TensorFlow 作为`tf.keras`正式发行。 这表明 Keras 现在已经与 TensorFlow 紧密集成,并且很可能会在很长一段时间内继续作为开源工具进行开发。
......@@ -346,8 +346,8 @@ Keras 提供了直观的类来表示这些组件中的每个组件:
| --- | --- |
| 完整的顺序神经网络的高级抽象。 | `keras.models.Sequential()` |
| 密集的全连接层。 | `keras.layers.core.Dense()` |
| 激活功能。 | `keras.layers.core.Activation()` |
| LSTM 循环神经网络。 此类包含此体系结构专有的组件,其中大多数由 Keras 抽象。 | `keras.layers.recurrent.LSTM()` |
| 激活函数。 | `keras.layers.core.Activation()` |
| LSTM 循环神经网络。 此类包含此构专有的组件,其中大多数由 Keras 抽象。 | `keras.layers.recurrent.LSTM()` |
> 表 3:Keras API 中的关键组件说明。 我们将使用这些组件来构建深度学习模型。
......@@ -377,7 +377,7 @@ model.compile(loss="mse", optimizer="rmsprop")
此实现将在“第 3 课”,“模型评估和优化”中进一步优化。
Keras 抽象允许人们专注于使深度学习系统更具性能的关键元素:正确的组件顺序,要包含的层和节点的数量以及要使用的激活功能。 所有这些选择都取决于将组件添加到实例化的`keras.models.Sequential()`类的顺序或通过传递给每个组件实例化的参数(即`Activation("linear")`)确定的。 最后的`model.compile()`步骤使用 TensorFlow 组件构建神经网络。
Keras 抽象允许人们专注于使深度学习系统更具性能的关键元素:正确的组件顺序,要包含的层和节点的数量以及要使用的激活函数。 所有这些选择都取决于将组件添加到实例化的`keras.models.Sequential()`类的顺序或通过传递给每个组件实例化的参数(即`Activation("linear")`)确定的。 最后的`model.compile()`步骤使用 TensorFlow 组件构建神经网络。
建立网络后,我们使用`model.fit()`方法训练网络。 这将产生一个经过训练的模型,可用于进行预测:
......@@ -399,7 +399,7 @@ model.predict(x=X_train)
> “代码段 2.2”:`model.predict()`的用法
前面的步骤介绍了使用神经网络的 Keras 范例。 尽管可以用非常不同的方式处理不同的体系结构,但是 Keras 通过使用以下三个组件简化了使用不同体系结构的界面:网络体系结构,适应性和预测性:
前面的步骤介绍了使用神经网络的 Keras 范例。 尽管可以用非常不同的方式处理不同的架构,但是 Keras 通过使用以下三个组件简化了使用不同架构的界面:网络架构,适应性和预测性:
![Model Components](img/image02_27.jpg)
......@@ -423,7 +423,7 @@ Keras 用作较低级程序的接口; 在这种情况下,使用 TensorFlow
使用 Jupyter Notebook `Activity_4_Creating_a_TensorFlow_Model_Using_Keras.ipynb`从“模型组件”部分构建相同的模型,对输入和输出的周期长度进行参数设置,以便进行实验。
编译模型后,我们将其作为`h5`文件存储在磁盘上。 优良作法是偶尔将模型的版本存储在磁盘上,以便将模型体系结构的版本与预测功能一起保留。
编译模型后,我们将其作为`h5`文件存储在磁盘上。 优良作法是偶尔将模型的版本存储在磁盘上,以便将模型构的版本与预测功能一起保留。
仍在同一 Jupyter 笔记本的上,导航至标题**保存模型**。 在该部分中,我们将使用以下命令将模型存储为磁盘上的文件:
......@@ -431,7 +431,7 @@ Keras 用作较低级程序的接口; 在这种情况下,使用 TensorFlow
model.save('bitcoin_lstm_v0.h5')
```
模型`'bitcoin_lstm_v0.h5'`尚未训练。 如果在没有事先培训的情况下保存模型,则只能有效地保存模型的体系结构。 稍后可以使用 Keras 的`load_model()`函数来加载相同的模型,如下所示:
模型`'bitcoin_lstm_v0.h5'`尚未训练。 如果在没有事先培训的情况下保存模型,则只能有效地保存模型的构。 稍后可以使用 Keras 的`load_model()`函数来加载相同的模型,如下所示:
```py
1 model = keras.models.load_model('bitcoin_lstm_v0.h5')
......@@ -457,7 +457,7 @@ model.save('bitcoin_lstm_v0.h5')
# 从数据准备到建模
本节重点介绍深度学习系统的实现方面。 我们将使用“选择正确的模型体系结构”中的比特币数据和 Keras 知识,并使用 Keras 作为 TensorFlow 接口将这两个组件组合在一起。 本节通过构建一个从磁盘读取数据并将其作为单个软件馈入模型的系统来结束本课程。
本节重点介绍深度学习系统的实现方面。 我们将使用“选择正确的模型构”中的比特币数据和 Keras 知识,并使用 Keras 作为 TensorFlow 接口将这两个组件组合在一起。 本节通过构建一个从磁盘读取数据并将其作为单个软件馈入模型的系统来结束本课程。
## 训练神经网络
......@@ -695,7 +695,7 @@ LSTM 是计算上昂贵的模型。 在现代计算机上,我们最多可能
我们将保存此训练有素的网络以供将来参考,并将其性能与其他模型进行比较。
网络可能已经从我们的数据中学到了模式,但是如何用如此简单的体系结构和很少的数据来做到这一点呢? LSTM 是用于从数据中学习模式的强大工具。 但是,我们将在接下来的课程中学习到,他们也可能遭受*过拟合*的困扰,这是神经网络中常见的一种现象,他们会从训练数据中学习模式,这些模式在预测实际模式时无用 。 我们将学习如何处理该问题以及如何改进我们的网络以做出有用的预测。
网络可能已经从我们的数据中学到了模式,但是如何用如此简单的构和很少的数据来做到这一点呢? LSTM 是用于从数据中学习模式的强大工具。 但是,我们将在接下来的课程中学习到,他们也可能遭受*过拟合*的困扰,这是神经网络中常见的一种现象,他们会从训练数据中学习模式,这些模式在预测实际模式时无用 。 我们将学习如何处理该问题以及如何改进我们的网络以做出有用的预测。
### 注意
......
......@@ -17,7 +17,7 @@
* 添加层和节点
* 探索并添加历元
* 实现激活功能
* 实现激活函数
* 使用正则化策略
# 模型评估
......@@ -174,7 +174,7 @@ Keras 提供了`model.evaluate(),`方法,该方法使针对测试集评估训
`evaluate()`方法返回损失函数的结果以及传递给`metrics`参数的函数的结果。 我们将在比特币问题中频繁使用该函数来测试模型在测试集上的表现。
您会注意到,比特币模型看起来与上面的示例有些不同。 那是因为我们使用的是 LSTM 体系结构。 LSTM 旨在预测序列。 因此,即使是回归问题,我们也不使用一组变量来预测另一个变量。 相反,我们使用单个变量(或一组变量)的先前观察值来预测同一变量(或一组变量)的未来观察结果。 `Keras.fit()`上的`y`参数包含与`x`参数相同的变量,但仅包含预测序列。
您会注意到,比特币模型看起来与上面的示例有些不同。 那是因为我们使用的是 LSTM 构。 LSTM 旨在预测序列。 因此,即使是回归问题,我们也不使用一组变量来预测另一个变量。 相反,我们使用单个变量(或一组变量)的先前观察值来预测同一变量(或一组变量)的未来观察结果。 `Keras.fit()`上的`y`参数包含与`x`参数相同的变量,但仅包含预测序列。
## 评估比特币模型
......@@ -376,7 +376,7 @@ return np.mean(np.abs((A - B) / A)) * 100
图 9:绘制测试集每个星期从 model.predict()返回的归一化值
我们还将进行相同的比较,但使用非标准化值。 为了使我们的数据不规范,我们必须首先确定测试集和预测之间的等效周。 然后,我们获取该周的第一个价格值,并使用它来逆转“第 2 课,模型体系结构”中的点相对标准化方程。
我们还将进行相同的比较,但使用非标准化值。 为了使我们的数据不规范,我们必须首先确定测试集和预测之间的等效周。 然后,我们获取该周的第一个价格值,并使用它来逆转“第 2 课,模型构”中的点相对标准化方程。
11. 导航到标题“非规范化预测”,然后执行该标题下的所有单元格。
12. 在本节中,我们定义了函数`denormalize()`,该函数执行完整的反规范化过程。 与其他函数不同,此函数采用 Pandas 数据帧而不是 NumPy 数组。 我们这样做是为了将日期用作索引。 这是与该标题最相关的单元格块:
......@@ -444,7 +444,7 @@ return np.mean(np.abs((A - B) / A)) * 100
* 添加或删除层并更改节点数
* 增加或减少训练次数
* 试用不同的激活功能
* 试用不同的激活函数
* 使用不同的正则化策略
我们将使用在“模型评估”部分末尾开发的相同的主动学习环境来评估每种修改,并测量这些策略中的每一种如何帮助我们开发更精确的模型。
......@@ -479,7 +479,7 @@ return np.mean(np.abs((A - B) / A)) * 100
现在,我们将通过添加更多层来修改我们的原始 LSTM 模型。 在 LSTM 模型中,通常会按顺序添加 LSTM 层,从而在 LSTM 层之间形成一条链。 在我们的案例中,新的 LSTM 层具有与原始层相同的神经元数量,因此我们不必配置该参数。
我们将命名模型的修改版本`bitcoin_lstm_v1`。 优良作法是为每个要尝试不同的超参数配置的模型命名。 这有助于您跟踪每个不同体系结构的性能,还可以轻松比较 TensorBoard 中的模型差异。 在本课程结束时,我们将比较所有不同的修改架构。
我们将命名模型的修改版本`bitcoin_lstm_v1`。 优良作法是为每个要尝试不同的超参数配置的模型命名。 这有助于您跟踪每个不同构的性能,还可以轻松比较 TensorBoard 中的模型差异。 在本课程结束时,我们将比较所有不同的修改架构。
### 注意
......@@ -539,15 +539,15 @@ model.fit(x=X, y=Y, batch_size=1,
这一变化将我们的模型更改为`v2`,有效地使其变为`bitcoin_lstm_v2`
###### 激活功能
###### 激活函数
激活功能评估您需要多少时间才能*激活*单个神经元。 他们使用上一层的输入和损失函数的结果(或者神经元是否应该传递任何值)来确定每个神经元将传递到网络下一个元素的值。
激活函数评估您需要多少时间才能*激活*单个神经元。 他们使用上一层的输入和损失函数的结果(或者神经元是否应该传递任何值)来确定每个神经元将传递到网络下一个元素的值。
### 注意
激活函数是研究神经网络的科学界非常感兴趣的主题。 有关当前正在对该主题进行的研究概述以及有关激活功能如何工作的更详细的评论,请参阅 Ian Goodfellow 等的《深度学习》。 麻省理工学院出版社,2017 年。
激活函数是研究神经网络的科学界非常感兴趣的主题。 有关当前正在对该主题进行的研究概述以及有关激活函数如何工作的更详细的评论,请参阅 Ian Goodfellow 等的《深度学习》。 麻省理工学院出版社,2017 年。
TensorFlow 和 Keras 提供了许多激活功能-偶尔会添加新的激活功能。 引言中,三个重要的考虑因素; 让我们探索它们中的每一个。
TensorFlow 和 Keras 提供了许多激活函数-偶尔会添加新的激活函数。 引言中,三个重要的考虑因素; 让我们探索它们中的每一个。
### 注意
......@@ -559,7 +559,7 @@ TensorFlow 和 Keras 提供了许多激活功能-偶尔会添加新的激活功
![Linear (Identity)](img/image03_32.jpg)
`c = 1`时,神经元将按原样传递值,而无需激活功能进行修改。 使用线性函数的问题是,由于神经元是线性激活的,因此链接的层现在可以用作单个大层。 换句话说,一个人失去了构建多层网络的能力,其中一个人的输出会影响另一个人:
`c = 1`时,神经元将按原样传递值,而无需激活函数进行修改。 使用线性函数的问题是,由于神经元是线性激活的,因此链接的层现在可以用作单个大层。 换句话说,一个人失去了构建多层网络的能力,其中一个人的输出会影响另一个人:
![Linear (Identity)](img/image03_20.jpg)
......@@ -595,9 +595,9 @@ ReLU 具有非线性属性。 它们的定义是:
我们不会在网络中使用 ReLU 函数,因为我们的规范化过程会创建许多负值,从而导致学习模型慢得多。
###### 激活功能-实现
###### 激活函数-实现
在 Keras 中实现激活功能的最简单方法是实例化`Activation()`类,并将其添加到`Sequential()`模型中。 可以使用 Keras 中可用的任何激活功能实例化`Activation()`(有关完整列表,请参见[这里](https://keras.io/activations/))。 在我们的例子中,我们将使用`tanh`功能。 实现激活功能后,我们将模型的版本更改为`v2`,使其变为`bitcoin_lstm_v3`
在 Keras 中实现激活函数的最简单方法是实例化`Activation()`类,并将其添加到`Sequential()`模型中。 可以使用 Keras 中可用的任何激活函数实例化`Activation()`(有关完整列表,请参见[这里](https://keras.io/activations/))。 在我们的例子中,我们将使用`tanh`功能。 实现激活函数后,我们将模型的版本更改为`v2`,使其变为`bitcoin_lstm_v3`
```py
model = Sequential()
......@@ -622,9 +622,9 @@ ReLU 具有非线性属性。 它们的定义是:
model.compile(loss="mse", optimizer="rmsprop")
```
> “代码段 10”:在`bitcoin_lstm_v2 model`中添加激活功能 tanh,使其成为`bitcoin_lstm_v3`
> “代码段 10”:在`bitcoin_lstm_v2 model`中添加激活函数 tanh,使其成为`bitcoin_lstm_v3`
还有许多其他激活功能值得尝试。 TensorFlow 和 Keras 都在各自的官方文档中提供了已实现功能的列表。 在实施自己的方法之前,请先从 TensorFlow 和 Keras 中已实施的方法开始。
还有许多其他激活函数值得尝试。 TensorFlow 和 Keras 都在各自的官方文档中提供了已实现功能的列表。 在实施自己的方法之前,请先从 TensorFlow 和 Keras 中已实施的方法开始。
###### 正则化策略
......@@ -717,7 +717,7 @@ MAPE(整个系列)
###### 活动 7 –优化深度学习模型
在此活动中,我们对在“第 2 课”,“模型体系结构”(`bitcoin_lstm_v0`)中创建的模型实施不同的优化策略。 该模型在完整的反规范化测试集上获得了大约 8.4% 的 MAPE 性能。 我们将努力缩小这一差距。
在此活动中,我们对在“第 2 课”,“模型构”(`bitcoin_lstm_v0`)中创建的模型实施不同的优化策略。 该模型在完整的反规范化测试集上获得了大约 8.4% 的 MAPE 性能。 我们将努力缩小这一差距。
1. 在您的终端上,通过执行以下命令来启动 TensorBoard 实例:
......@@ -768,7 +768,7 @@ MAPE(整个系列)
activation_function = "tanh"
```
我们在本节中使用了`tanh`功能,但是请随时尝试其他激活功能。 查看[这个页面](https://keras.io/activations/)上可用的列表,然后尝试其他可能性。
我们在本节中使用了`tanh`功能,但是请随时尝试其他激活函数。 查看[这个页面](https://keras.io/activations/)上可用的列表,然后尝试其他可能性。
我们的最终选择是尝试不同的正则化策略。 这显然更加复杂,并且可能需要花费一些迭代才能注意到任何收益,尤其是数据量很少时。 此外,添加正则化策略通常会增加网络的培训时间。
......
......@@ -23,7 +23,7 @@
## 分离数据和模型
构建深度学习应用程序时,两个最重要的领域是数据和模型。 从体系结构的角度来看,我们建议将这两个区域分开。 我们认为这是一个好建议,因为这些区域中的每个区域都包含固有地彼此分离的功能。 通常需要收集,清理,组织和规范化数据; 模型需要进行训练,评估并能够做出预测。 这两个领域都是相互依存的,但最好分开处理。
构建深度学习应用程序时,两个最重要的领域是数据和模型。 从构的角度来看,我们建议将这两个区域分开。 我们认为这是一个好建议,因为这些区域中的每个区域都包含固有地彼此分离的功能。 通常需要收集,清理,组织和规范化数据; 模型需要进行训练,评估并能够做出预测。 这两个领域都是相互依存的,但最好分开处理。
按照该建议,我们将使用两个类来帮助我们构建 Web 应用程序:`CoinMarketCap()``Model()`
......@@ -83,7 +83,7 @@
> “代码段 2”:`Model()`类中的`train()`方法。 该方法使用来自`self.X`和`self.Y`的数据训练`self.model`中可用的模型。
在前面的代码片段中,您将注意到`train()`方法类似于“第 3 课”,“模型评估与优化”中“活动 6”和`7`的解决方案。 总体思路是,可以很容易地将 Keras 工作流程中的每个过程(构建或设计,训练,评估和预测)转变为程序的不同部分。 在我们的例子中,我们将它们变成可以从`Model()`类调用的方法。 这将组织我们的程序,并提供一系列约束(例如在模型体系结构或某些 API 参数上),以帮助我们在稳定的环境中部署模型。
在前面的代码片段中,您将注意到`train()`方法类似于“第 3 课”,“模型评估与优化”中“活动 6”和`7`的解决方案。 总体思路是,可以很容易地将 Keras 工作流程中的每个过程(构建或设计,训练,评估和预测)转变为程序的不同部分。 在我们的例子中,我们将它们变成可以从`Model()`类调用的方法。 这将组织我们的程序,并提供一系列约束(例如在模型构或某些 API 参数上),以帮助我们在稳定的环境中部署模型。
在下一部分中,我们将探讨处理新数据的通用策略。
......@@ -272,7 +272,7 @@ M.train(model_data[i*7:7*(40 + i) + 7])
###### 将模型部署为 Web 应用程序
在此部分中,我们将模型部署为 Web 应用程序。 我们将使用一个名为“ `cryptonic`”的示例 Web 应用程序来部署我们的模型,探索其体系结构,以便将来进行修改。 目的是让您将此应用程序用作更复杂应用程序的入门程序; 可以正常工作的启动器,可以根据需要扩展。
在此部分中,我们将模型部署为 Web 应用程序。 我们将使用一个名为“ `cryptonic`”的示例 Web 应用程序来部署我们的模型,探索其构,以便将来进行修改。 目的是让您将此应用程序用作更复杂应用程序的入门程序; 可以正常工作的启动器,可以根据需要扩展。
除了熟悉 Python 外,本主题还假定您熟悉创建 Web 应用程序。 具体来说,我们假设您对 Web 服务器,路由,HTTP 协议和缓存有所了解。 无需广泛了解这些主题,您就可以在本地部署演示的密码应用程序,但是学习这些主题将使将来的开发变得更加容易。
......
......@@ -67,7 +67,7 @@ ReLu 非线性函数-大于零。
# 软最大
在本节中,我们将学习称为`softmax`的输出激活功能。 我们将研究它与输出类的关系,并了解`softmax`如何产生概率。
在本节中,我们将学习称为`softmax`的输出激活函数。 我们将研究它与输出类的关系,并了解`softmax`如何产生概率。
让我们来看看! 当我们构建分类器时,神经网络将输出一堆数字,通常是一个数组,每个数组对应一个类。 对于我们在这里看到的模型,它将是从零到九的数字。 `softmax`的作用是将一大堆数字平滑成一组总计为一个的概率分数:
......
# 使用连体网络的人脸和音频识别
在上一章中,我们了解了什么是元学习和不同类型的元学习技术。 我们还看到了如何通过梯度下降和优化来学习梯度下降,这是一次快速学习的模型。 在本章中,我们将学习一种称为**连体网络**的最常用的基于度量的单次学习算法。 我们将看到连体网络如何从很少的数据点学习以及如何将它们用于解决低数据问题。 之后,我们将详细探讨连体网络的体系结构,并看到连体网络的一些应用。 在本章的最后,我们将学习如何使用连体网络构建人脸和音频识别模型。
在上一章中,我们了解了什么是元学习和不同类型的元学习技术。 我们还看到了如何通过梯度下降和优化来学习梯度下降,这是一次快速学习的模型。 在本章中,我们将学习一种称为**连体网络**的最常用的基于度量的单次学习算法。 我们将看到连体网络如何从很少的数据点学习以及如何将它们用于解决低数据问题。 之后,我们将详细探讨连体网络的构,并看到连体网络的一些应用。 在本章的最后,我们将学习如何使用连体网络构建人脸和音频识别模型。
在本章中,您将学习以下内容:
* 什么是连体网络?
* 连体网络的体系结
* 连体网络的
* 连体网络的应用
* 使用连体网络进行人脸识别
* 使用连体网络构建音频识别模型
......@@ -22,9 +22,9 @@
连体网络不仅用于人脸识别,而且还广泛用于我们没有很多数据点和任务需要学习两个输入之间相似性的应用中。 连体网络的应用包括签名验证,相似问题检索,对象跟踪等。 我们将在下一部分中详细研究连体网络。
# 连体网络的体系结
# 连体网络的
现在,我们对连体网络有了基本的了解,我们将详细探讨它们。 下图显示了连体网络的体系结构:
现在,我们对连体网络有了基本的了解,我们将详细探讨它们。 下图显示了连体网络的构:
![](img/5b9384ce-2640-4df1-8d41-f668a5da1b79.png)
......@@ -52,13 +52,13 @@
# 连体网络的应用
如我们所知,连体网络通过使用相同的体系结构找到两个输入值之间的相似性来学习。 它是涉及两个实体之间的计算相似性的任务中最常用的一次性学习算法之一。 它功能强大且强大,可作为低数据问题的解决方案。
如我们所知,连体网络通过使用相同的构找到两个输入值之间的相似性来学习。 它是涉及两个实体之间的计算相似性的任务中最常用的一次性学习算法之一。 它功能强大且强大,可作为低数据问题的解决方案。
在发表连体网络的[第一篇论文](https://papers.nips.cc/paper/769-signature-verification-using-a-siamese-time-delay-neural-network.pdf)中,作者描述了网络对于签名验证任务的重要性。 签名验证任务的目的是识别签名的真实性。 因此,作者用真正的和不正确的签名对训练了连体网络,并使用了卷积网络从签名中提取特征。 提取特征后,他们测量了两个特征向量之间的距离以识别相似性。 因此,当出现新的签名时,我们提取特征并将其与签名者存储的特征向量进行比较。 如果距离小于某个阈值,则我们接受签名为真实签名,否则我们拒绝签名。
连体网络也广泛用于 NLP 任务。 [有一篇有趣的论文](http://www.aclweb.org/anthology/W16-1617),作者使用连体网络来计算文本相似度。 他们使用连体网络作为双向单位,并使用余弦相似度作为能量函数来计算文本之间的相似度。
连体网络的应用是无止境的。 它们已经堆叠了用于执行各种任务的各种体系结构,例如人类动作识别,场景更改检测和机器翻译。
连体网络的应用是无止境的。 它们已经堆叠了用于执行各种任务的各种构,例如人类动作识别,场景更改检测和机器翻译。
# 使用连体网络进行人脸识别
......
......@@ -15,7 +15,7 @@
# NTM
NTM 是一种有趣的算法,能够存储和检索内存中的信息。 NTM 的想法是用外部存储器来增强神经网络-也就是说,它不是使用隐藏状态作为存储器,而是使用外部存储器来存储和检索信息。 NTM 的体系结构如下图所示:
NTM 是一种有趣的算法,能够存储和检索内存中的信息。 NTM 的想法是用外部存储器来增强神经网络-也就是说,它不是使用隐藏状态作为存储器,而是使用外部存储器来存储和检索信息。 NTM 的构如下图所示:
![](img/94347b9c-5fca-4272-9de0-c6c802eb7525.png)
......
......@@ -23,7 +23,7 @@
4. 连体网络的输入应该成对`(X1, X2)`及其二进制标记`Y ∈ (0, 1)`,指出输入对是真实对(相同)还是非真实对(不同)。
5. 连体网络的应用是无止境的。 它们已经堆叠了用于执行各种任务的各种体系结构,例如人类动作识别,场景更改检测和机器翻译。
5. 连体网络的应用是无止境的。 它们已经堆叠了用于执行各种任务的各种构,例如人类动作识别,场景更改检测和机器翻译。
# 第三章:原型网络及其变体
......
......@@ -22,9 +22,9 @@
第 7 章,“深度学习基础知识”涵盖了深度学习的各种基本概念。 首先,我们将学习神经网络是什么,然后我们将看到不同类型的神经网络,例如 RNN,LSTM 和 CNN。 我们将通过构建一些应用程序来学习,这些应用程序执行诸如生成歌曲歌词和对时尚产品进行分类等任务。
第 8 章,“使用深度 Q 网络玩 Atari 游戏”涵盖了最广泛使用的深度强化学习算法之一,称为深度 Q 网络(DQN)。 我们将通过探索 DQN 的各个组成部分来学习 DQN,然后我们将了解如何构建一个代理来使用 DQN 玩 Atari 游戏。 然后,我们将研究 DQN 体系结构的一些升级,例如双 DQN 和决斗 DQN。
第 8 章,“使用深度 Q 网络玩 Atari 游戏”涵盖了最广泛使用的深度强化学习算法之一,称为深度 Q 网络(DQN)。 我们将通过探索 DQN 的各个组成部分来学习 DQN,然后我们将了解如何构建一个代理来使用 DQN 玩 Atari 游戏。 然后,我们将研究 DQN 构的一些升级,例如双 DQN 和决斗 DQN。
第 9 章,“使用深度循环 Q 网络玩末日游戏”,介绍了深度循环 Q 网络(DRQN)及其与 DQN 的区别。 我们将看到如何构建使用 DRQN 播放 Doom 的代理。 在本章的后面,我们将学习深度注意力循环 Q 网络,该网络将注意力机制添加到 DRQN 体系结构中。
第 9 章,“使用深度循环 Q 网络玩末日游戏”,介绍了深度循环 Q 网络(DRQN)及其与 DQN 的区别。 我们将看到如何构建使用 DRQN 播放 Doom 的代理。 在本章的后面,我们将学习深度注意力循环 Q 网络,该网络将注意力机制添加到 DRQN 构中。
第 10 章,“异步优势参与者批评者网络”解释了异步优势参与者批评者(A3C)网络的工作方式。 我们将详细探讨 A3C 架构,然后将学习如何构建使用 A3C 上山的代理。
......
......@@ -21,7 +21,7 @@ OpenAI 是由 Elon Musk 和 Sam Altman 创立的非营利性,开源**人工智
要下载 Anaconda,请访问[这里](https://www.anaconda.com/download/),您将在此处看到用于下载用于不同平台的 Anaconda 的选项。
如果使用 Windows 或 Mac,则可以根据计算机体系结构直接下载图形安装程序,然后使用图形安装程序进行安装。
如果使用 Windows 或 Mac,则可以根据计算机构直接下载图形安装程序,然后使用图形安装程序进行安装。
如果您使用的是 Linux,请按照以下步骤操作:
......
......@@ -55,9 +55,9 @@
处理输入后,隐藏层将其结果发送到输出层。 顾名思义,输出层发出输出。 输出层中神经元的数量与我们希望网络解决的问题类型有关。 如果是二进制分类,则输出层中神经元的数量会告诉我们输入所属的类。 如果是五类的多类分类,并且如果我们要获取每个类作为输出的概率,则输出层中的神经元数为五,每个神经元发出该概率。 如果是回归问题,则输出层中只有一个神经元。
# 激活功能
# 激活函数
激活函数用于在神经网络中引入非线性。 我们将激活函数应用于权重乘以并加到偏差上的输入,即`f(z)`,其中`z = 输入 * 权重 + 偏差`。 激活功能有以下几种:
激活函数用于在神经网络中引入非线性。 我们将激活函数应用于权重乘以并加到偏差上的输入,即`f(z)`,其中`z = 输入 * 权重 + 偏差`。 激活函数有以下几种:
* **Sigmoid 函数**:Sigmoid 函数是最常用的激活函数之一。 它在`0``1`之间缩放值。 可以将 Sigmoid 函数定义为![](img/00163.jpeg)。 当我们将此功能应用于`z`时,值将在 0 到`1`的范围内缩放。 这也称为逻辑函数。 它是 Sigmoid,如下图所示:
......@@ -67,7 +67,7 @@
![](img/00166.gif)
* **ReLU 函数**:ReLU 也称为整流线性单元。 它是使用最广泛的激活功能之一。 ReLU 函数可以定义为`f(z) = max(0, z)`,即当`z`小于 0 且`f(z)`为 0。 当`z`大于或等于`0`时,等于`z`
* **ReLU 函数**:ReLU 也称为整流线性单元。 它是使用最广泛的激活函数之一。 ReLU 函数可以定义为`f(z) = max(0, z)`,即当`z`小于 0 且`f(z)`为 0。 当`z`大于或等于`0`时,等于`z`
![](img/00168.gif)
......@@ -443,7 +443,7 @@ RNN 是一种特殊类型的神经网络,广泛应用于顺序数据。 换句
逐渐消失的梯度不仅会出现在 RNN 中,还会发生在其他深层网络中,在这些深层网络中,当我们使用 S 型/ tanh 函数时会出现许多隐藏层。 还有一个称为爆炸梯度的问题,其中梯度值变得大于 1,当我们将这些梯度相乘时,它将导致很大的数字。
一种解决方案是将 ReLU 用作激活功能。 但是,我们有一个称为 LSTM 的 RNN 变体,它可以有效解决消失的梯度问题。 我们将在接下来的部分中看到它的工作原理。
一种解决方案是将 ReLU 用作激活函数。 但是,我们有一个称为 LSTM 的 RNN 变体,它可以有效解决消失的梯度问题。 我们将在接下来的部分中看到它的工作原理。
# 长短期记忆 RNN
......@@ -803,7 +803,7 @@ CNN 通常包含三个主要层:
# 全连接层
我们可以有多个卷积层,然后是池化层。 但是,这些图层只会从输入图像中提取特征并生成激活图。 我们如何仅凭激活图对图像中是否有一条狗进行分类? 我们必须引入一个称为全连接层的新层。 当激活图(现在基本上是图像的特征)应用激活功能时,它将接收输入,并产生输出。 全连接层实际上是正常的神经网络,其中我们具有输入层,隐藏层和输出层。 在这里,我们使用卷积和池化层代替输入层,它们一起产生激活图作为输入。
我们可以有多个卷积层,然后是池化层。 但是,这些图层只会从输入图像中提取特征并生成激活图。 我们如何仅凭激活图对图像中是否有一条狗进行分类? 我们必须引入一个称为全连接层的新层。 当激活图(现在基本上是图像的特征)应用激活函数时,它将接收输入,并产生输出。 全连接层实际上是正常的神经网络,其中我们具有输入层,隐藏层和输出层。 在这里,我们使用卷积和池化层代替输入层,它们一起产生激活图作为输入。
# CNN 架构
......@@ -1059,7 +1059,7 @@ with tf.Session() as sess:
问题列表如下:
1. 线性回归和神经网络有什么区别?
2. 激活功能有什么用?
2. 激活函数有什么用?
3. 为什么我们需要计算梯度下降中的梯度?
4. RNN 的优势是什么?
5. 什么是消失和爆炸的梯度问题?
......
......@@ -2,12 +2,12 @@
**深度 Q 网络****DQN**)是非常流行且广泛使用的**深度强化学习****DRL**)算法之一。 实际上,它在发布之后,在**强化学习****RL**)社区周围引起了很多轰动。 该算法由 Google 的 DeepMind 的研究人员提出,在玩任何 Atari 游戏时,只要将游戏屏幕作为输入,就可以达到人类水平的结果。
在本章中,我们将探讨 DQN 的工作原理,并学习如何通过仅将游戏屏幕作为输入来构建可玩任何 Atari 游戏的 DQN。 我们将研究 DQN 体系结构的一些改进,例如双重 DQN 和决斗网络体系结构。
在本章中,我们将探讨 DQN 的工作原理,并学习如何通过仅将游戏屏幕作为输入来构建可玩任何 Atari 游戏的 DQN。 我们将研究 DQN 架构的一些改进,例如双重 DQN 和决斗网络架构。
在本章中,您将学习:
* **深度 Q 网络****DQN**
* DQN 的体系结
* DQN 的
* 建立代理来玩 Atari 游戏
* 双 DQN
* 优先经验回放
......@@ -30,19 +30,19 @@
我们更新权重,并通过梯度下降使损失最小化。 简而言之,在 DQN 中,我们使用神经网络作为函数逼近器来逼近`Q`函数,并且通过梯度下降使误差最小化。
# DQN 的体系结
# DQN 的
现在,我们对 DQN 有了基本的了解,我们将详细介绍 DQN 的工作原理以及用于玩 Atari 游戏的 DQN 的体系结构。 我们将研究每个组件,然后将整个算法视为一个整体。
现在,我们对 DQN 有了基本的了解,我们将详细介绍 DQN 的工作原理以及用于玩 Atari 游戏的 DQN 的构。 我们将研究每个组件,然后将整个算法视为一个整体。
# 卷积网络
DQN 的第一层是卷积网络,网络的输入将是游戏屏幕的原始帧。 因此,我们采用原始框架并将其传递给卷积层以了解游戏状态。 但是原始帧将具有 210 x 160 像素和 128 个调色板,并且如果我们直接输入原始像素,显然将需要大量的计算和内存。 因此,我们将像素下采样为 84 x 84,并将 RGB 值转换为灰度值,然后将经过预处理的游戏屏幕作为卷积层的输入。 卷积层通过识别图像中不同对象之间的空间关系来理解游戏屏幕。 我们使用两个卷积层,然后使用具有 ReLU 作为激活函数的全连接层。 在这里,我们不使用池化层。
当执行诸如对象检测或分类之类的任务时,池层非常有用,其中我们不考虑对象在图像中的位置,而只想知道所需对象是否在图像中。 例如,如果我们要对图像中是否有狗进行分类,我们只查看图像中是否有狗,而不检查狗在哪里。 在那种情况下,使用池化层对图像进行分类,而与狗的位置无关。 但是对于我们来说,要了解游戏屏幕,位置很重要,因为它描述了游戏状态。 例如,在 Pong 游戏中,我们不仅要分类游戏屏幕上是否有球。 我们想知道球的位置,以便我们下一步行动。 这就是为什么我们在体系结构中不使用池化层的原因。
当执行诸如对象检测或分类之类的任务时,池层非常有用,其中我们不考虑对象在图像中的位置,而只想知道所需对象是否在图像中。 例如,如果我们要对图像中是否有狗进行分类,我们只查看图像中是否有狗,而不检查狗在哪里。 在那种情况下,使用池化层对图像进行分类,而与狗的位置无关。 但是对于我们来说,要了解游戏屏幕,位置很重要,因为它描述了游戏状态。 例如,在 Pong 游戏中,我们不仅要分类游戏屏幕上是否有球。 我们想知道球的位置,以便我们下一步行动。 这就是为什么我们在构中不使用池化层的原因。
好的,我们如何计算 Q 值? 如果我们传递一个游戏画面和一个动作作为 DQN 的输入,它将给我们 Q 值。 但这将需要一个完整的前向通过,因为一个状态中将有许多动作。 而且,游戏中将有许多状态,每个动作都有一个前移,这在计算上将是昂贵的。 因此,我们只需将游戏屏幕单独作为输入,并通过将输出层中的单位数设置为游戏状态下的动作数,即可获得该状态下所有可能动作的 Q 值。
下图显示了 DQN 的体系结构,我们在其中馈送了一个游戏屏幕,它提供了该游戏状态下所有动作的 Q 值:
下图显示了 DQN 的构,我们在其中馈送了一个游戏屏幕,它提供了该游戏状态下所有动作的 Q 值:
![](img/00249.jpeg)
......@@ -434,22 +434,22 @@ with tf.Session() as sess:
因此,值函数指定状态的优劣,而优势函数指定动作的优劣。 如果我们将价值功能和优势功能结合起来会发生什么? 这将告诉我们代理在状态`s`实际上是我们的`Q`功能下执行动作`a`有多好。 因此,我们可以像![](img/00285.jpeg)中那样将`Q`函数定义为值函数和优势函数的和。
现在,我们将看到决斗网络体系结构是如何工作的。 下图显示了对决 DQN 的体系结构:
现在,我们将看到决斗网络架构是如何工作的。 下图显示了对决 DQN 的架构:
![](img/00286.gif)
决斗 DQN 的体系结构与 DQN 基本上相同,只是在末端的全连接层分为两个流。 一个流计算值函数,而另一个流计算优势函数。 最后,我们使用聚合层组合这两个流,并获得 Q 函数。
决斗 DQN 的构与 DQN 基本上相同,只是在末端的全连接层分为两个流。 一个流计算值函数,而另一个流计算优势函数。 最后,我们使用聚合层组合这两个流,并获得 Q 函数。
为什么我们必须将我们的 Q 函数计算分成两个流? 在许多州,计算所有动作的价值估算并不重要,尤其是当我们在一个状态中有较大的动作空间时; 那么大多数动作将不会对状态产生任何影响。 同样,可能会有许多具有冗余效果的动作。 在这些情况下,与现有 DQN 体系结构相比,决斗 DQN 可以更精确地估算 Q 值:
为什么我们必须将我们的 Q 函数计算分成两个流? 在许多州,计算所有动作的价值估算并不重要,尤其是当我们在一个状态中有较大的动作空间时; 那么大多数动作将不会对状态产生任何影响。 同样,可能会有许多具有冗余效果的动作。 在这些情况下,与现有 DQN 构相比,决斗 DQN 可以更精确地估算 Q 值:
* 当我们在状态中有大量动作时,并且估计每个动作的值并不是很重要时,第一个流与值函数流中一样有用。
* 与优势功能流一样,第二个流在网络必须决定优先选择哪个操作的情况下很有用
聚合器层合并这两个流的值,并产生`Q`函数。 因此,决斗网络比标准 DQN 体系结构更有效,更健壮。
聚合器层合并这两个流的值,并产生`Q`函数。 因此,决斗网络比标准 DQN 构更有效,更健壮。
# 概要
在本章中,我们学习了一种非常流行的深度强化学习算法,称为 DQN。 我们看到了如何使用深度神经网络来逼近 Q 函数。 我们还学习了如何建立代理来玩 Atari 游戏。 后来,我们研究了 DQN 的一些改进,例如双 DQN,它用于避免高估 Q 值。 然后,我们研究了优先级经验重放,优先级经验和决斗的网络体系结构,该体系结构将 Q 函数计算分为两个流,分别称为值流和优势流。
在本章中,我们学习了一种非常流行的深度强化学习算法,称为 DQN。 我们看到了如何使用深度神经网络来逼近 Q 函数。 我们还学习了如何建立代理来玩 Atari 游戏。 后来,我们研究了 DQN 的一些改进,例如双 DQN,它用于避免高估 Q 值。 然后,我们研究了优先级经验重放,优先级经验和决斗的网络架构,该架构将 Q 函数计算分为两个流,分别称为值流和优势流。
在下一章第 9 章,“实用深度循环 Q 网络玩末日之战”中,我们将介绍一种称为 DRQN 的非常酷的 DQN 变体,它利用 RNN 近似于一个 Q 功能。
......
# 用深度循环 Q 网络玩世界末日
在上一章中,我们介绍了如何使用**深度 Q 网络****DQN**)构建代理以玩 Atari 游戏。 我们利用神经网络来逼近 Q 函数,使用了**卷积神经网络****CNN**)来理解输入游戏画面,并利用过去的四个游戏画面来更好地理解 当前的游戏状态。 在本章中,我们将学习如何利用**循环神经网络****RNN**)来提高 DQN 的性能。 我们还将研究**马尔可夫决策过程****MDP**)的部分可观察之处,以及如何使用**深度循环 Q 网络****DRQN**)。 接下来,我们将学习如何构建一个代理来使用 DRQN 玩《毁灭战士》游戏。 最后,我们将看到 DRQN 的一种变体,称为**深度注意力循环 Q 网络****DARQN**),它增强了 DRQN 体系结构的注意力机制。
在上一章中,我们介绍了如何使用**深度 Q 网络****DQN**)构建代理以玩 Atari 游戏。 我们利用神经网络来逼近 Q 函数,使用了**卷积神经网络****CNN**)来理解输入游戏画面,并利用过去的四个游戏画面来更好地理解 当前的游戏状态。 在本章中,我们将学习如何利用**循环神经网络****RNN**)来提高 DQN 的性能。 我们还将研究**马尔可夫决策过程****MDP**)的部分可观察之处,以及如何使用**深度循环 Q 网络****DRQN**)。 接下来,我们将学习如何构建一个代理来使用 DRQN 玩《毁灭战士》游戏。 最后,我们将看到 DRQN 的一种变体,称为**深度注意力循环 Q 网络****DARQN**),它增强了 DRQN 构的注意力机制。
在本章中,您将学习以下主题:
* DRQN
* 部分可观察的 MDP
* DRQN 的体系结
* DRQN 的
* 如何建立代理以使用 DRQN 玩《毁灭战士》游戏
* DARQN
......@@ -20,11 +20,11 @@
为了克服这个问题,我们将不仅仅考虑当前的游戏屏幕,而将使用过去的四个游戏屏幕来了解球的方向和速度。 这就是我们在 DQN 中看到的。 我们将过去的四个游戏屏幕以及当前的游戏屏幕作为输入输入到卷积层,并接收该状态下所有可能动作的 Q 值。 但是,您认为仅使用过去的四个屏幕将有助于我们了解不同的环境吗? 在某些环境下,我们甚至可能需要过去的 100 个游戏屏幕来更好地了解当前游戏状态。 但是,堆叠过去的`n`游戏画面会减慢我们的训练过程,而且还会增加我们的经验回放缓冲区的大小。
因此,只要需要,我们就可以利用 RNN 的优势来理解和保留有关先前状态的信息。 在第 7 章“深度学习基础知识”中,我们了解了如何将**长短期记忆循环神经网络****LSTM RNN**)用于 通过保留,忘记和更新所需的信息来生成文本以及了解文本的上下文。 我们将通过扩展 LSTM 层来修改 DQN 体系结构,以了解先前的信息。 在 DQN 架构中,我们用 LSTM RNN 替换了第一卷积后全连接层。 这样,我们也可以解决部分可观察性的问题,因为现在我们的代理可以记住过去的状态并可以改进策略。
因此,只要需要,我们就可以利用 RNN 的优势来理解和保留有关先前状态的信息。 在第 7 章“深度学习基础知识”中,我们了解了如何将**长短期记忆循环神经网络****LSTM RNN**)用于 通过保留,忘记和更新所需的信息来生成文本以及了解文本的上下文。 我们将通过扩展 LSTM 层来修改 DQN 构,以了解先前的信息。 在 DQN 架构中,我们用 LSTM RNN 替换了第一卷积后全连接层。 这样,我们也可以解决部分可观察性的问题,因为现在我们的代理可以记住过去的状态并可以改进策略。
# DRQN 的体系结
# DRQN 的
接下来显示 DRQN 的体系结构。 它类似于 DQN,但是我们用 LSTM RNN 替换了第一卷积后全连接层,如下所示:
接下来显示 DRQN 的构。 它类似于 DQN,但是我们用 LSTM RNN 替换了第一卷积后全连接层,如下所示:
![](img/00288.gif)
......@@ -562,13 +562,13 @@ train(num_episodes = 10000, episode_length = 300, learning_rate = 0.01, render =
# DARQN
我们通过添加可捕获时间依赖性的循环层来改进 DQN 架构,我们将其称为 DRQN。 您认为我们可以进一步改善我们的 DRQN 架构吗? 是。 通过在卷积层之上添加关注层,我们可以进一步改善我们的 DRQN 体系结构。 那么,关注层的功能是什么? 注意意味着单词的字面意思。 注意机制广泛用于图像字幕,对象检测等。 考虑神经网络为图像添加字幕的任务; 为了理解图像中的内容,网络必须注意图像中的特定对象以生成字幕。
我们通过添加可捕获时间依赖性的循环层来改进 DQN 架构,我们将其称为 DRQN。 您认为我们可以进一步改善我们的 DRQN 架构吗? 是。 通过在卷积层之上添加关注层,我们可以进一步改善我们的 DRQN 构。 那么,关注层的功能是什么? 注意意味着单词的字面意思。 注意机制广泛用于图像字幕,对象检测等。 考虑神经网络为图像添加字幕的任务; 为了理解图像中的内容,网络必须注意图像中的特定对象以生成字幕。
类似地,当我们在 DRQN 中添加关注层时,我们可以选择并关注图像的小区域,最终这会减少网络中的参数数量,并减少训练和测试时间。 与 DRQN 不同,DARQN 中的 LSTM 层不仅存储了先前的状态信息以采取下一个最佳操作,而且还保留了先前的状态信息。 它还存储用于确定下一个图像焦点的信息。
# DARQN 的体系结
# DARQN 的
DARQN 的体系结构如下所示:
DARQN 的构如下所示:
![](img/00291.gif)
......
......@@ -21,13 +21,13 @@ A3C 网络风起云涌,并接管了 DQN。 除了前面提到的优点之外
在 A3C 中,第一个 A,**异步**表示其工作方式。 在这里,我们有多个与环境交互的代理,而不是像 DQN 那样有单个代理尝试学习最佳策略。 由于我们有多个代理同时与环境交互,因此我们将环境的副本提供给每个代理,以便每个代理可以与自己的环境副本进行交互。 因此,所有这些多个代理都称为辅助代理,我们有一个单独的代理,称为全局网络,所有代理都向其报告。 全球网络汇集了学习内容。
第二个 A 是**优势**; 在讨论 DQN 的决斗网络体系结构时,我们已经看到了优势功能。 优势函数可以定义为 Q 函数和值函数之间的差。 我们知道 Q 函数指定状态下动作的状态,而 value 函数指定状态下状态的状态。 现在,凭直觉思考; 两者之间的区别意味着什么? 它告诉我们,与其他所有动作相比,代理在状态`s`下执行动作`a`有多好。
第二个 A 是**优势**; 在讨论 DQN 的决斗网络构时,我们已经看到了优势功能。 优势函数可以定义为 Q 函数和值函数之间的差。 我们知道 Q 函数指定状态下动作的状态,而 value 函数指定状态下状态的状态。 现在,凭直觉思考; 两者之间的区别意味着什么? 它告诉我们,与其他所有动作相比,代理在状态`s`下执行动作`a`有多好。
第三个 A 是**演员评论家**; 该架构具有两种类型的网络,即参与者和评论者。 演员的角色是学习策略,评论家的角色是评估演员学习的策略有多好。
# A3C 的架构
现在,让我们看一下 A3C 的体系结构。 看下图:
现在,让我们看一下 A3C 的构。 看下图:
![](img/00292.gif)
......
......@@ -220,7 +220,7 @@ class PolicyGradient:
在第 8 章,“深度 Q 网络和 Atari 游戏”中,我们研究了 DQN 的工作原理,并应用了 DQN 玩 Atari 游戏。 但是,在那些离散的环境中,我们只有一组有限的动作。 想象一个连续的环境空间,例如训练机器人走路; 在那些环境中,应用 Q 学习是不可行的,因为要找到一个贪婪的策略将需要在每一步进行很多优化。 即使我们使连续的环境离散,我们也可能会失去重要的功能并最终获得大量的动作空间。 当我们拥有巨大的行动空间时,很难实现融合。
因此,我们使用称为 Actor Critic 的新架构,该架构具有两个网络-Actor 和 Critic。 Actor Critic 体系结构结合了策略梯度和状态操作值功能。 **演员**网络的作用是通过调整参数![](img/00310.jpeg)来确定**状态**中的最佳动作,而**评论家**的作用是评估**演员**产生的动作。 **评论家**通过计算时间差异误差来评估演员的行动。 也就是说,我们在**演员**网络上执行策略梯度以选择操作, **评论家**网络使用 TD 误差评估由**演员**网络产生的操作。 下图显示了演员评论家体系结构:
因此,我们使用称为 Actor Critic 的新架构,该架构具有两个网络-Actor 和 Critic。 Actor Critic 架构结合了策略梯度和状态操作值功能。 **演员**网络的作用是通过调整参数![](img/00310.jpeg)来确定**状态**中的最佳动作,而**评论家**的作用是评估**演员**产生的动作。 **评论家**通过计算时间差异误差来评估演员的行动。 也就是说,我们在**演员**网络上执行策略梯度以选择操作, **评论家**网络使用 TD 误差评估由**演员**网络产生的操作。 下图显示了演员评论家架构:
![](img/00311.gif)
......
# Capstone 项目–使用 DQN 进行赛车
在最后几章中,我们通过使用神经网络逼近 q 函数来了解 Deep Q 学习的工作原理。 在此之后,我们看到了**深度 Q 网络****DQN**)的各种改进,例如 Double Q 学习,决斗网络体系结构和深度循环 Q 网络。 我们已经了解了 DQN 如何利用回放缓冲区来存储座席的经验,并使用缓冲区中的小批样本来训练网络。 我们还实现了用于玩 Atari 游戏的 DQN 和一个用于玩 Doom 游戏的**深度循环 Q 网络****DRQN**)。 在本章中,让我们进入对决 DQN 的详细实现,它与常规 DQN 基本相同,除了最终的全连接层将分解为两个流,即值流和优势流,而这些流 两个流将合并在一起以计算 Q 函数。 我们将看到如何训练决斗的 DQN 来赢得赛车比赛的代理商。
在最后几章中,我们通过使用神经网络逼近 q 函数来了解 Deep Q 学习的工作原理。 在此之后,我们看到了**深度 Q 网络****DQN**)的各种改进,例如 Double Q 学习,决斗网络构和深度循环 Q 网络。 我们已经了解了 DQN 如何利用回放缓冲区来存储座席的经验,并使用缓冲区中的小批样本来训练网络。 我们还实现了用于玩 Atari 游戏的 DQN 和一个用于玩 Doom 游戏的**深度循环 Q 网络****DRQN**)。 在本章中,让我们进入对决 DQN 的详细实现,它与常规 DQN 基本相同,除了最终的全连接层将分解为两个流,即值流和优势流,而这些流 两个流将合并在一起以计算 Q 函数。 我们将看到如何训练决斗的 DQN 来赢得赛车比赛的代理商。
在本章中,您将学习如何实现以下内容:
......
......@@ -19,7 +19,7 @@
现在,我们将简短地了解想象力增强代理的工作原理。 I2A 充分利用了基于模型的学习和基于模型的学习。
I2A 的体系结构如下:
I2A 的构如下:
![](img/00408.gif)
......@@ -43,7 +43,7 @@ I2A 的体系结构如下:
![](img/00420.gif)
如果我们被要求玩推箱子,那么在做出任何举动之前,我们会想一想并计划好,因为糟糕的举动会导致游戏结束。 I2A 体系结构将在此类环境中提供良好的结果,在这种环境中,代理必须提前计划才能采取任何措施。 本文的作者在推箱子上测试了 I2A 性能,并取得了显著成果。
如果我们被要求玩推箱子,那么在做出任何举动之前,我们会想一想并计划好,因为糟糕的举动会导致游戏结束。 I2A 构将在此类环境中提供良好的结果,在这种环境中,代理必须提前计划才能采取任何措施。 本文的作者在推箱子上测试了 I2A 性能,并取得了显著成果。
# 向人的偏好学习
......@@ -66,7 +66,7 @@ I2A 的体系结构如下:
# 从演示中进行深度 Q 学习
我们已经了解了很多有关 DQN 的知识。 我们从香草 DQN 开始,然后看到了各种改进,例如双重 DQN,决斗的网络体系结构和优先级的经验回放。 我们还学会了构建 DQN 来玩 Atari 游戏。 我们将代理与环境的交互存储在经验缓冲区中,并使代理从这些经验中学习。 但是问题是,我们花了很多培训时间来提高性能。 对于在模拟环境中学习,这很好,但是当我们让代理在现实环境中学习时,会引起很多问题。 为了克服这个问题,谷歌公司 DeepMind 的研究人员在演示(**DQfd**)的基础上,对 DQN 进行了改进,称为**深度 Q 学习**
我们已经了解了很多有关 DQN 的知识。 我们从香草 DQN 开始,然后看到了各种改进,例如双重 DQN,决斗的网络构和优先级的经验回放。 我们还学会了构建 DQN 来玩 Atari 游戏。 我们将代理与环境的交互存储在经验缓冲区中,并使代理从这些经验中学习。 但是问题是,我们花了很多培训时间来提高性能。 对于在模拟环境中学习,这很好,但是当我们让代理在现实环境中学习时,会引起很多问题。 为了克服这个问题,谷歌公司 DeepMind 的研究人员在演示(**DQfd**)的基础上,对 DQN 进行了改进,称为**深度 Q 学习**
如果我们已经有了一些演示数据,则可以将这些演示直接添加到经验回放缓冲区中。 例如,考虑一个学习玩 Atari 游戏的特工。 如果我们已经有了一些演示数据来告诉我们的代理,哪个状态更好,哪个动作可以提供良好的回报,那么代理可以直接使用此数据进行学习。 即使是少量的演示,也可以提高座席的表现并最大程度地减少培训时间。 由于演示的数据将直接添加到优先经验重放缓冲区中,因此代理可以从演示数据中使用的数据量以及代理可以从其自己的交互中用于学习的数据量将由优先经验重放来控制 缓冲,因为经验将被优先考虑。
......
......@@ -12,7 +12,7 @@
第 2 章,“迁移学习”涵盖了如何使用迁移学习来检测人眼中糖尿病性视网膜病变的情况以及确定视网膜病变的严重程度。 我们将探索 CNN,并学习如何使用能够在人眼眼底图像中检测出糖尿病性视网膜病变的 CNN 训练模型。
第 3 章,“神经机器翻译”涵盖了**循环神经网络****RNN**体系结构的基础。 我们还将学习三种不同的机器翻译系统:基于规则的机器翻译,统计机器翻译和神经机器翻译。
第 3 章,“神经机器翻译”涵盖了**循环神经网络****RNN**构的基础。 我们还将学习三种不同的机器翻译系统:基于规则的机器翻译,统计机器翻译和神经机器翻译。
第 4 章,“在 GAN 中使用 GAN” 进行时尚行业中的样式迁移,说明如何创建智能 AI 模型以生成具有与给定手袋相似样式的鞋子,反之亦然。 我们将使用 Vanilla GAN 通过 GAN 的定制版本(例如 DiscoGAN 和 CycleGAN)来实施项目。
......
......@@ -82,7 +82,7 @@
# 神经激活单位
取决于体系结构和当前的问题,在神经网络中使用了几种神经激活单元。 我们将讨论最常用的激活功能,因为它们在确定网络体系结构和性能方面起着重要作用。 线性和 S 形单位激活函数主要用于人工神经网络,直到 Hinton 等人发明的**整流线性单元****ReLUs**)彻底改变了神经网络的性能。
取决于架构和当前的问题,在神经网络中使用了几种神经激活单元。 我们将讨论最常用的激活函数,因为它们在确定网络架构和性能方面起着重要作用。 线性和 S 形单位激活函数主要用于人工神经网络,直到 Hinton 等人发明的**整流线性单元****ReLUs**)彻底改变了神经网络的性能。
# 线性激活单元
......@@ -106,7 +106,7 @@
![](img/f54ce333-0cdb-400f-b9d1-22d60475291f.png)
图 1.6:乙状结肠激活功能
图 1.6:乙状结肠激活函数
自然界中任何复杂的过程通常在输入输出关系上都是非线性的,因此,我们需要非线性激活函数通过神经网络对其进行建模。 两类分类的神经网络的输出概率通常由 S 型神经单元的输出给定,因为它的输出值从零到一。 输出概率可以表示如下:
......@@ -120,17 +120,17 @@
![](img/ff09283d-c4ae-42d3-8b20-5c6cb9523899.png)
tanh 激活功能输出的值在`[-1, 1]`范围内,如下图所示:
tanh 激活函数输出的值在`[-1, 1]`范围内,如下图所示:
![](img/58f98f0c-6a81-4acc-bafb-9b0f683ad9c9.png)
图 1.7:Tanh 激活功能
图 1.7:Tanh 激活函数
需要注意的一件事是 S 型和 tanh 激活函数在很小的输入范围内都是线性的,超过该范围输出就会饱和。 在饱和区,激活函数(相对于输入)的梯度非常小或接近零; 这意味着它们非常容易消失梯度问题。 正如您将在后面看到的那样,神经网络将从反向传播方法中学习,在该方法中,层的梯度取决于后续层中直至最终输出层中激活单元的梯度。 因此,如果激活单元中的单元在饱和区域中工作,则将更少的误差反向传播到神经网络的早期层。 神经网络通过利用梯度来最小化预测误差,以学习权重和偏差(`W`)。 这意味着,如果梯度很小或消失为零,则神经网络将无法正确学习这些权重。
# 整流线性单元(ReLU)
当神经元的总输入大于零时,ReLU 的输出为线性,而当神经元的总输入为负时,ReLU 的输出为零。 这个简单的激活函数为神经网络提供了非线性,同时,它相对于总输入提供了一个恒定的梯度。 这个恒定的梯度有助于防止神经网络出现饱和或消失的梯度问题,如激活功能(如 S 型和 tanh 激活单元)所示。 ReLU 函数输出(如图“图 1.8”所示)可以表示如下:
当神经元的总输入大于零时,ReLU 的输出为线性,而当神经元的总输入为负时,ReLU 的输出为零。 这个简单的激活函数为神经网络提供了非线性,同时,它相对于总输入提供了一个恒定的梯度。 这个恒定的梯度有助于防止神经网络出现饱和或消失的梯度问题,如激活函数(如 S 型和 tanh 激活单元)所示。 ReLU 函数输出(如图“图 1.8”所示)可以表示如下:
![](img/f3c8b630-6ebc-4f71-903a-d192d27621f7.png)
......@@ -138,7 +138,7 @@ ReLU 激活函数可以绘制如下:
![](img/56ed1747-01f7-48fa-9a00-db7d1b05a8f9.png)
图 1.8:ReLU 激活功能
图 1.8:ReLU 激活函数
ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢训练速度,尤其是在初始阶段。 LReLU 激活函数(如图 1.9 所示)在这种情况下非常有用,即使输出和梯度不为零,即使输入为负值。 ReLU 输出函数泄漏可以表示如下:
......@@ -146,11 +146,11 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢
![](img/66329819-1528-4067-afc8-bf3e505ecb09.png)
将为泄漏的 ReLU 激活功能提供![](img/7e701921-1d53-4bbb-9ed7-e386eacc553c.png)参数,而对于参数 ReLU,![](img/21c3900a-a283-44ba-b15e-21d1faf0b243.png)是神经网络将通过训练学习的参数。 下图显示了泄漏的 ReLU 激活函数的输出:
将为泄漏的 ReLU 激活函数提供![](img/7e701921-1d53-4bbb-9ed7-e386eacc553c.png)参数,而对于参数 ReLU,![](img/21c3900a-a283-44ba-b15e-21d1faf0b243.png)是神经网络将通过训练学习的参数。 下图显示了泄漏的 ReLU 激活函数的输出:
![](img/908a6fec-a34a-4e27-a0a4-27dd3b5d84cc.png)
图 1.9:泄漏的 ReLU 激活功能
图 1.9:泄漏的 ReLU 激活函数
# softmax 激活单元
......@@ -162,7 +162,7 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢
![](img/2c4f3f2d-fb61-4823-bad9-632d16200fe2.png)
还有其他几种激活功能,大多数是这些基本版本的变体。 我们将在以下各章介绍的不同项目中讨论它们时,对它们进行讨论。
还有其他几种激活函数,大多数是这些基本版本的变体。 我们将在以下各章介绍的不同项目中讨论它们时,对它们进行讨论。
# 训练神经网络的反向传播方法
......@@ -274,7 +274,7 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢
# 循环神经网络(RNN)
**循环神经网络****RNN**)在处理顺序或时间数据时非常有用,其中给定实例或位置的数据与先前时间步长或位置中的数据高度相关。 RNN 在处理文本数据方面已经非常成功,因为给定实例中的单词与它前面的单词高度相关。 在 RNN 中,网络在每个时间步执行相同的功能,因此名称中的术语为**循环**。 下图说明了 RNN 的体系结构:
**循环神经网络****RNN**)在处理顺序或时间数据时非常有用,其中给定实例或位置的数据与先前时间步长或位置中的数据高度相关。 RNN 在处理文本数据方面已经非常成功,因为给定实例中的单词与它前面的单词高度相关。 在 RNN 中,网络在每个时间步执行相同的功能,因此名称中的术语为**循环**。 下图说明了 RNN 的构:
![](img/0c426b93-140c-48a7-b982-e649cbaac4e3.png)
......@@ -286,7 +286,7 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢
![](img/4ce6cd6d-4a3d-4c78-9aa6-364d288f20c7.png)
如果我们要预测句子中的下一个单词,则函数`f[2]`通常是词汇表中单词的 softmax 函数。 根据当前问题,`f[1]`功能可以是任何激活功能
如果我们要预测句子中的下一个单词,则函数`f[2]`通常是词汇表中单词的 softmax 函数。 根据当前问题,`f[1]`功能可以是任何激活函数
在 RNN 中,步骤`t`中的输出错误会尝试纠正先前时间步中的预测,并通过`k ∈ 1, 2, ..., t-1`来概括。 通过传播先前时间步长中的错误来实现。 这有助于 RNN 了解彼此相距较远的单词之间的长期依赖性。 实际上,由于梯度问题的消失和爆炸,并非总是可能通过 RNN 学习这么长的依赖关系。
......@@ -312,7 +312,7 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢
# 长短期记忆(LSTM)单元
消失的梯度问题在很大程度上由 RNN 的改进版本(称为**长短期记忆****LSTM**)单元)解决。 长短期存储单元的体系结构图如下:
消失的梯度问题在很大程度上由 RNN 的改进版本(称为**长短期记忆****LSTM**)单元)解决。 长短期存储单元的构图如下:
![](img/eab0d93b-3c6d-4fb8-a9ac-d49481457c76.png)
......@@ -496,7 +496,7 @@ Figure 1.14: GAN architecture 
**受限玻尔兹曼机****RBM**)是一门无监督的机器学习算法,用于学习数据的内部表示。 RBM 具有可见层`v ∈ R^m`,以及隐藏层`h ∈ R^n`。 RBM 学习在可见层中将输入呈现为隐藏层中的低维表示。 给定可见层输入,所有隐藏层单元在条件上都是独立的。 类似地,给定隐藏层输入,所有可见层在条件上都是独立的。 给定隐藏层输入,这使得 RBM 可以独立地对可见单元的输出进行采样,反之亦然。
下图说明了 RBM 的体系结构:
下图说明了 RBM 的构:
![](img/0c7517cc-ffec-4988-956f-e2258a4c314d.png)
......@@ -532,7 +532,7 @@ Figure 1.14: GAN architecture 
与 RBM 十分相似,**自编码器**是一类无监督的学习算法,旨在发现数据中的隐藏结构。 在**主成分分析****PCA**)中,我们尝试捕获输入变量之间的线性关系,并尝试通过(输入的)线性组合来表示降维空间中的数据 变量),这说明了数据的大部分差异。 但是,PCA 无法捕获输入变量之间的非线性关系。
自编码器是一种神经网络,可以捕获输入变量之间的非线性相互作用,同时在隐藏层中以不同维度表示输入。 在大多数情况下,隐藏层的尺寸小于输入的尺寸。 假设存在高维数据固有的低维结构,我们跳过了这一点。 例如,高维图像可以由低维流形表示,并且自编码器通常用于发现该结构。 下图说明了自编码器的神经体系结构:
自编码器是一种神经网络,可以捕获输入变量之间的非线性相互作用,同时在隐藏层中以不同维度表示输入。 在大多数情况下,隐藏层的尺寸小于输入的尺寸。 假设存在高维数据固有的低维结构,我们跳过了这一点。 例如,高维图像可以由低维流形表示,并且自编码器通常用于发现该结构。 下图说明了自编码器的神经构:
![](img/594d3d11-05f5-4367-a760-726135cf225b.png)
......
......@@ -5,7 +5,7 @@
我们将在本章中涉及的与迁移学习有关的一些关键主题如下:
* 使用迁移学习来检测人眼中的糖尿病性视网膜病变状况,并确定视网膜病变的严重程度
* 探索可用于训练可检测人眼眼底图像中的糖尿病性视网膜病变的**卷积神经网络****CNN**)的高级预训练卷积神经体系结
* 探索可用于训练可检测人眼眼底图像中的糖尿病性视网膜病变的**卷积神经网络****CNN**)的高级预训练卷积神经
* 查看实际实施 CNN 所需的不同图像预处理步骤
* 学习制定适合当前问题的成本函数
* 定义适当的度量标准以衡量训练模型的性能
......@@ -23,7 +23,7 @@
# 迁移学习简介
在传统的机器学习范例中(请参见“图 2.1”),每个用例或任​​务都是根据手头的数据独立建模的。 在迁移学习中,我们使用从特定任务中获得的知识(以体系结构和模型参数的形式)来解决不同(但相关)的任务,如下图所示:
在传统的机器学习范例中(请参见“图 2.1”),每个用例或任​​务都是根据手头的数据独立建模的。 在迁移学习中,我们使用从特定任务中获得的知识(以构和模型参数的形式)来解决不同(但相关)的任务,如下图所示:
![](img/07387bba-04ab-4758-9ac4-8740ea2f1bea.png)
......@@ -271,7 +271,7 @@ datagen = ImageDataGenerator(
# 网络架构
现在,我们将对经过预训练的`ResNet50``InceptionV3``VGG16`网络进行实验,并找出哪种网络效果最好。 每个预训练模型的权重均基于 ImageNet。 我提供了 ResNet,`InceptionV3``VGG16`体系结构的原始论文的链接,以供参考。 建议读者仔细阅读这些文章,以深入了解这些体系结构及其之间的细微差别。
现在,我们将对经过预训练的`ResNet50``InceptionV3``VGG16`网络进行实验,并找出哪种网络效果最好。 每个预训练模型的权重均基于 ImageNet。 我提供了 ResNet,`InceptionV3``VGG16`架构的原始论文的链接,以供参考。 建议读者仔细阅读这些文章,以深入了解这些架构及其之间的细微差别。
VGG 论文链接如下:
......@@ -285,15 +285,15 @@ InceptionV3 论文链接如下:
[《重新思考计算机视觉的起始架构》](https://arxiv.org/abs/1512.00567)
简而言之,`VGG16`是一个 16 层的 CNN,使用 3 x 3 滤波器和 2 x 2 接收场进行卷积。 整个网络使用的激活功能都是 ReLU。 由 Simonyan 和 Zisserman 开发的 VGG 架构是 2014 年 ILSVRC 竞赛的亚军。 `VGG16`网络由于其简单性而广受欢迎,它是从图像中提取特征的最受欢迎的网络。
简而言之,`VGG16`是一个 16 层的 CNN,使用 3 x 3 滤波器和 2 x 2 接收场进行卷积。 整个网络使用的激活函数都是 ReLU。 由 Simonyan 和 Zisserman 开发的 VGG 架构是 2014 年 ILSVRC 竞赛的亚军。 `VGG16`网络由于其简单性而广受欢迎,它是从图像中提取特征的最受欢迎的网络。
`ResNet50`是一种深层的 CNN,它实现了残余块的概念,与`VGG16`网络的概念完全不同。 经过一系列的卷积激活池操作之后,该块的输入再次被反馈到输出。 ResNet 体系结构是由 Kaiming He 等人开发的,尽管具有 152 层,但它不如 VGG 网络复杂。 该架构通过实现 3.57% 的前五位错误率赢得了 2015 年 ILSVRC 竞赛,这比该竞赛数据集上的人类水平性能要好。 通过检查目标是否在概率最高的五类预测中来计算前五个错误率。 原则上,ResNet 网络尝试学习残差映射,而不是直接从输出映射到输入,如下面的残差框图所示:
`ResNet50`是一种深层的 CNN,它实现了残余块的概念,与`VGG16`网络的概念完全不同。 经过一系列的卷积激活池操作之后,该块的输入再次被反馈到输出。 ResNet 构是由 Kaiming He 等人开发的,尽管具有 152 层,但它不如 VGG 网络复杂。 该架构通过实现 3.57% 的前五位错误率赢得了 2015 年 ILSVRC 竞赛,这比该竞赛数据集上的人类水平性能要好。 通过检查目标是否在概率最高的五类预测中来计算前五个错误率。 原则上,ResNet 网络尝试学习残差映射,而不是直接从输出映射到输入,如下面的残差框图所示:
![](img/6e52be2c-3618-4411-8f03-b372b21e42c7.png)
图 2.8:ResNet 模型的残差块
**InceptionV3** 是 Google 提供的最新的 CNN。 InceptionV3 体系结构没有在每一层使用固定大小的卷积滤波器,而是使用不同大小的滤波器来提取不同粒度级别的特征。 下图说明了 InceptionV3 层的卷积块:
**InceptionV3** 是 Google 提供的最新的 CNN。 InceptionV3 构没有在每一层使用固定大小的卷积滤波器,而是使用不同大小的滤波器来提取不同粒度级别的特征。 下图说明了 InceptionV3 层的卷积块:
![](img/afb2d8e3-f919-49c3-9ede-13e707b6d72e.png)
......@@ -303,7 +303,7 @@ Inception V1(GoogleNet)是 2014 年 ILSVRC 竞赛的获胜者。 它的最
# VGG16 迁移学习网络
我们将从预训练的`VGG16`网络中的最后一个合并层中获取输出,并添加一对全连接层,每个层 512 个单元,然后是输出层。 最终池化层的输出是从全局平均池化操作传递到全连接层之前的。 我们只可以展平池化层的输出,而不是执行全局平均池化-其思想是确保池化的输出不是二维晶格格式,而是一维数组格式, 非常像一个全连接层。 下图说明了基于预训练的`VGG16`的新`VGG16`体系结构:
我们将从预训练的`VGG16`网络中的最后一个合并层中获取输出,并添加一对全连接层,每个层 512 个单元,然后是输出层。 最终池化层的输出是从全局平均池化操作传递到全连接层之前的。 我们只可以展平池化层的输出,而不是执行全局平均池化-其思想是确保池化的输出不是二维晶格格式,而是一维数组格式, 非常像一个全连接层。 下图说明了基于预训练的`VGG16`的新`VGG16`构:
![](img/c2ef9608-eaff-46fd-990c-75a189d2463b.png)
......@@ -885,7 +885,7 @@ Validation Quadratic Kappa Score: 0.44422008110380984
# 分类结果
通过使用所有三个神经网络体系结`VGG16``ResNet50``InceptionV3`进行分类。 对于该糖尿病性视网膜病用例,使用迁移学习网络的`InceptionV3`版本可获得最佳结果。 如果是分类分类,我们只是将具有最大预测分类概率的分类转换为预测严重性标签。 但是,由于问题中的类别具有序数意义,因此我们可以利用 softmax 概率的方法之一是针对 softmax 概率对类别严重性进行期望并得出预期分数![](img/9da8911b-24ab-4c74-8b78-2f195780a9d6.png)如下 :
通过使用所有三个神经网络`VGG16``ResNet50``InceptionV3`进行分类。 对于该糖尿病性视网膜病用例,使用迁移学习网络的`InceptionV3`版本可获得最佳结果。 如果是分类分类,我们只是将具有最大预测分类概率的分类转换为预测严重性标签。 但是,由于问题中的类别具有序数意义,因此我们可以利用 softmax 概率的方法之一是针对 softmax 概率对类别严重性进行期望并得出预期分数![](img/9da8911b-24ab-4c74-8b78-2f195780a9d6.png)如下 :
![](img/13040376-dbdd-411b-85da-5ae7e4231683.png)
......
......@@ -7,7 +7,7 @@
* 从源语言到目标语言的词到词映射并非始终可用。
* 即使在源语言和目标语言之间确实存在精确的词对词映射,这些语言的句法结构通常也不相互对应。 机器翻译中的此问题通常称为*对齐错误*
但是,随着**循环神经网络****RNN**体系结构的最新进展,机器翻译不仅提供了更高的翻译质量,而且还提供了更高的翻译质量 这种系统的复杂性远远小于传统系统。
但是,随着**循环神经网络****RNN**构的最新进展,机器翻译不仅提供了更高的翻译质量,而且还提供了更高的翻译质量 这种系统的复杂性远远小于传统系统。
机器翻译系统大致可分为三类:基于规则的机器翻译,统计机器翻译和神经机器翻译。
......@@ -204,7 +204,7 @@ NMT 与其他传统方法相比的一些优点如下:
# 编码器-解码器型号
下图说明了一种神经翻译机的体系结构,该结构使用一个 LSTM 作为编码器,将输入源语言序列编码为最终隐藏状态`h[f]`和最终存储单元状态`c[f]`。 最终的隐藏状态和单元状态`[h[f]; c[f]]`将捕获整个输入序列的上下文。 因此,`[h[f]; c[f]]`成为解码器网络可适应的良好候选者。
下图说明了一种神经翻译机的构,该结构使用一个 LSTM 作为编码器,将输入源语言序列编码为最终隐藏状态`h[f]`和最终存储单元状态`c[f]`。 最终的隐藏状态和单元状态`[h[f]; c[f]]`将捕获整个输入序列的上下文。 因此,`[h[f]; c[f]]`成为解码器网络可适应的良好候选者。
此隐藏状态和单元状态信息`[h[f]; c[f]]`作为初始隐藏状态和单元状态被馈送到解码器网络,然后解码器 在目标序列上训练序列,其中输入目标序列相对于输出目标序列滞后一。 根据解码器,输入序列的第一个字是伪字`[START]`,而输出标签是字`c'est`。 解码器网络仅被训练为一种生成语言模型,在任何时候,输出标签`t`都是相对于输入的下一个单词,即`y[t] = x[t + 1]`。 唯一的新变化是编码器的最终隐藏状态和单元状态(即`[h[f]; c[f]]`) 解码器的隐藏状态和单元状态为翻译提供内容。
......@@ -214,13 +214,13 @@ NMT 与其他传统方法相比的一些优点如下:
图 3.3:神经机器翻译系统的高级编码器-解码器架构
如果`T`是与源语言文本![](img/39b615f1-11b1-4356-b3bb-e432b66d1e58.png)相对应的目标语言文本,那么为了进行训练,我们只是试图使`P[w](T[s+1] / S, T)`的对数概率相对于`W`最大化,其中`T[s+1]`表示目标语言文本已转换 只需一个时间步长,`W`表示编码器-解码器体系结构模型参数。
如果`T`是与源语言文本![](img/39b615f1-11b1-4356-b3bb-e432b66d1e58.png)相对应的目标语言文本,那么为了进行训练,我们只是试图使`P[w](T[s+1] / S, T)`的对数概率相对于`W`最大化,其中`T[s+1]`表示目标语言文本已转换 只需一个时间步长,`W`表示编码器-解码器构模型参数。
现在我们已经讨论了编码器-解码器 NMT 的训练过程,现在我们将研究如何在推理过程中使用训练后的模型。
# 使用编码器-解码器模型进行推理
**NMT****神经翻译机**)上进行推理的架构流程与训练 NMT 略有不同。 以下是使用 NMT 执行推理的体系结构流程:
**NMT****神经翻译机**)上进行推理的架构流程与训练 NMT 略有不同。 以下是使用 NMT 执行推理的构流程:
![](img/c8e700f7-0973-4a7a-b1d8-1f00a2ef91e7.png)
......@@ -330,7 +330,7 @@ NMT 与其他传统方法相比的一些优点如下:
dict((i, word) for word, i in self.target_word_index.items())
```
`process_input`函数利用先前功能中构建的输入和目标文本以及词汇表,将文本数据转换为数字形式,以供神经翻译机体系结构使用。 `process_input`功能的代码如下:
`process_input`函数利用先前功能中构建的输入和目标文本以及词汇表,将文本数据转换为数字形式,以供神经翻译机构使用。 `process_input`功能的代码如下:
```py
def process_input(self,input_texts,target_texts=None,verbose=True):
......
......@@ -290,7 +290,7 @@ def build_generator(self,image,reuse=False,name='generator'):
网络不同层中的输出要素图的数量可以是`self.gf` 或其倍数。 对于我们的 DiscoGAN 网络,我们选择了`self.gf`作为`64`
生成器中要注意的一件事是输出层的`tanh`激活功能。 这样可以确保生成器生成的图像的像素值在`[-1, +1]`的范围内。 这对于输入图像具有`[-1, +1]`范围内的像素强度非常重要,这可以通过对像素强度进行简单的逐元素变换来实现,如下所示:
生成器中要注意的一件事是输出层的`tanh`激活函数。 这样可以确保生成器生成的图像的像素值在`[-1, +1]`的范围内。 这对于输入图像具有`[-1, +1]`范围内的像素强度非常重要,这可以通过对像素强度进行简单的逐元素变换来实现,如下所示:
![](img/7d1812c6-e792-454e-a693-76421c5d5d91.png)
......
......@@ -14,8 +14,8 @@
作为本章的一部分,我们将讨论以下内容:
* 讨论 CNN 和 LSTM 在视频字幕中的作用
* 探索序列到序列视频字幕系统的体系结
* 利用*序列到序列的体系结构*,构建视频到文本的视频字幕系统
* 探索序列到序列视频字幕系统的
* 利用*序列到序列的构*,构建视频到文本的视频字幕系统
在下一节中,我们将介绍如何使用卷积神经网络和循环神经网络的 LSTM 版本来构建端到端视频字幕系统。
......@@ -51,11 +51,11 @@
o1, o2, . . . . . ot . . . oN = { "A ","man" "in" "a" "yellow" "helmet" "is" "working"}
```
既然我们对视频字幕在深度学习框架中的工作方式有了一个很好的了解,让我们在下一部分中讨论一个更高级的视频字幕网络,称为*逐序列视频字幕*。 在本章中,我们将使用相同的网络体系结构来构建*视频字幕系统*
既然我们对视频字幕在深度学习框架中的工作方式有了一个很好的了解,让我们在下一部分中讨论一个更高级的视频字幕网络,称为*逐序列视频字幕*。 在本章中,我们将使用相同的网络构来构建*视频字幕系统*
# 序列到序列的视频字幕系统
序列到序列的体系结构基于 Subhashini Venugopalan,Marcus Rohrbach,Jeff Donahue,Raymond Mooney,Trevor Darrell 和 Kate Saenko 撰写的名为《序列到序列-视频到文本》的论文。 该论文可以在[这个页面](https://arxiv.org/pdf/1505.00487.pdf)中找到。
序列到序列的构基于 Subhashini Venugopalan,Marcus Rohrbach,Jeff Donahue,Raymond Mooney,Trevor Darrell 和 Kate Saenko 撰写的名为《序列到序列-视频到文本》的论文。 该论文可以在[这个页面](https://arxiv.org/pdf/1505.00487.pdf)中找到。
在下图(“图 5.3”)中,说明了基于先前论文的*序列到字幕视频字幕*神经网络架构:
......@@ -71,15 +71,15 @@ o1, o2, . . . . . ot . . . oN = { "A ","man" "in" "a" "yellow" "helmet" "is" "wo
`N + 1`时间步长处,馈送到第二 LSTM 的单词`w[N]`是由`<bos>`表示的句子的开头。 一旦生成句子符号`<eos>`的结尾,就训练网络停止生成标题词。 总而言之,两个 LSTM 的设置方式是,一旦它们处理完所有视频图像帧特征 ![](img/8ad769e2-57c1-4581-98e1-7c7f70a12413.png),它们便开始产生文本标题词。
处理时间步`t > N`的第二个 LSTM 输入的另一种方法是只喂`w[t-1]`而不是`h[t], w[t-1]`,并在时间步`T`传递第一个 LSTM 的隐藏状态和单元状态`h[T], c[T]`,到第二个 LSTM 的初始隐藏和细胞状态。 这样的视频字幕网络的体系结构可以说明如下(请参见“图 5.4”):
处理时间步`t > N`的第二个 LSTM 输入的另一种方法是只喂`w[t-1]`而不是`h[t], w[t-1]`,并在时间步`T`传递第一个 LSTM 的隐藏状态和单元状态`h[T], c[T]`,到第二个 LSTM 的初始隐藏和细胞状态。 这样的视频字幕网络的构可以说明如下(请参见“图 5.4”):
![](img/f2805f4e-f512-4272-8988-4c3b2b73a400.png)
图 5.4:序列到序列模型的替代架构
预训练的卷积神经网络通常具有通用架构,例如`VGG16``VGG19``ResNet`,并在 ImageNet 上进行了预训练。 但是,我们可以基于从我们要为其构建视频字幕系统的域中的视频中提取的图像来重新训练这些体系结构。 我们还可以选择一种全新的 CNN 架构,并在特定于该域的视频图像上对其进行训练。
预训练的卷积神经网络通常具有通用架构,例如`VGG16``VGG19``ResNet`,并在 ImageNet 上进行了预训练。 但是,我们可以基于从我们要为其构建视频字幕系统的域中的视频中提取的图像来重新训练这些构。 我们还可以选择一种全新的 CNN 架构,并在特定于该域的视频图像上对其进行训练。
到目前为止,我们已经介绍了使用本节中说明的序列到序列体系结构开发视频字幕系统的所有技术先决条件。 请注意,本节中建议的替代体系结构设计是为了鼓励读者尝试几种设计,并查看哪种设计最适合给定的问题和数据集。
到目前为止,我们已经介绍了使用本节中说明的序列到序列架构开发视频字幕系统的所有技术先决条件。 请注意,本节中建议的替代架构设计是为了鼓励读者尝试几种设计,并查看哪种设计最适合给定的问题和数据集。
从下一部分开始,我们致力于构建智能视频字幕系统。
......@@ -87,7 +87,7 @@ o1, o2, . . . . . ot . . . oN = { "A ","man" "in" "a" "yellow" "helmet" "is" "wo
我们通过在`MSVD dataset`上训练模型来构建视频字幕系统,该模型是 Microsoft 的带预字幕的 YouTube 视频存储库。 [可以从以下链接下载所需的数据](http://www.cs.utexas.edu/users/ml/clamp/videoDescription/YouTubeClips.tar)[可通过以下链接获得视频的文本标题](https://github.com/jazzsaxmafia/video_to_sequence/files/387979/video_corpus.csv.zip)
`MSVD dataset`中大约有`1,938`个视频。 我们将使用它们来训练*逐序列视频字幕系统*。 还要注意,我们将在“图 5.3”中所示的序列到序列模型上构建模型。 但是,建议读者尝试在“图 5.4”中介绍的体系结构上训练模型,并了解其表现。
`MSVD dataset`中大约有`1,938`个视频。 我们将使用它们来训练*逐序列视频字幕系统*。 还要注意,我们将在“图 5.3”中所示的序列到序列模型上构建模型。 但是,建议读者尝试在“图 5.4”中介绍的构上训练模型,并了解其表现。
# 处理视频图像以创建 CNN 功能
......
......@@ -9,7 +9,7 @@
* 沃森
* Google Cloud Vision
下图“图 7.1,”说明了这种应用程序在云上托管时的体系结构以及如何与移动设备交互:
下图“图 7.1,”说明了这种应用程序在云上托管时的构以及如何与移动设备交互:
![](img/71528e0e-5829-47db-a724-312dc884f6f7.png)
......
......@@ -51,7 +51,7 @@
# 使用 LSTM 的序列到序列模型
序列到序列模型体系结构非常适合捕获客户输入的上下文,然后基于该上下文生成适当的响应。 “图 8.2”显示了一个序列到序列模型框架,该框架可以像聊天机器人那样回答问题:
序列到序列模型构非常适合捕获客户输入的上下文,然后基于该上下文生成适当的响应。 “图 8.2”显示了一个序列到序列模型框架,该框架可以像聊天机器人那样回答问题:
![](img/a9129778-213f-4d7d-8f07-04e7c50b78e9.png)
......@@ -67,7 +67,7 @@
# 建立序列到序列模型
我们将用于构建聊天机器人的序列到序列模型的体系结构将对先前在“图 8.2”中说明的基本序列到序列体系结构进行一些修改。修改后的架构可以在下图中看到(“图 8.3”):
我们将用于构建聊天机器人的序列到序列模型的架构将对先前在“图 8.2”中说明的基本序列到序列架构进行一些修改。修改后的架构可以在下图中看到(“图 8.3”):
![](img/e3a27c9d-19a4-4b77-a737-ef6ae8dec474.png)
......@@ -169,7 +169,7 @@ def words_to_indices(self,sent):
# 定义模型
RNN 的 LSTM 版本用于构建序列到序列模型。 这是因为 LSTM 在记住长文本序列中的长期依存关系方面效率更高。 LSTM 体系结构中的三个门使它能够有效地记住长期序列。 基本的 RNN 无法记住长期依赖关系,因为与其架构相关的梯度问题逐渐消失。
RNN 的 LSTM 版本用于构建序列到序列模型。 这是因为 LSTM 在记住长文本序列中的长期依存关系方面效率更高。 LSTM 构中的三个门使它能够有效地记住长期序列。 基本的 RNN 无法记住长期依赖关系,因为与其架构相关的梯度问题逐渐消失。
在此模型中,我们使用两个 LSTM。 第一个 LSTM 将输入推文编码为上下文向量。 该上下文向量不过是编码器 LSTM 的最后一个隐藏状态![](img/88e131cf-cc81-4f08-bb73-0bbb27ce18ed.png)`n`是隐藏状态向量的维。 输入推文![](img/ee42536a-7091-4d15-8ec9-ef97ead2b272.png)作为单词索引序列被馈送到编码器 LSTM,`k`就是输入推文的序列长度。 这些单词索引在馈送到 LSTM 之前已映射到单词嵌入`w ∈ R^m`。 单词嵌入包含在一个嵌入矩阵中`[W ∈ R^(m x N)]`,其中`N`表示词汇表中单词的数量。
......
......@@ -81,7 +81,7 @@ Q 值表也通过迭代`t`进行索引,因为代理只能查看到目前为止
# 制定成本函数
使用体系结构比较容易,在该体系结构中,可以获取网络馈给的给定状态的所有动作的 Q 值。 在图 9.3 的右侧中也进行了说明。 我们将让代理与环境交互并收集状态和奖励,以此为基础我们将学习 Q 函数。 实际上,网络会通过将给定状态`s`的所有动作![](img/e80900f0-58f0-404b-b333-9afac7b951bd.png)的预测 Q 值与目标 Q 值的预测 Q 值最小化来学习 Q 函数。 每个训练记录都是一个元组`s[t], a[t], r[t], s[t + 1]`
使用架构比较容易,在该架构中,可以获取网络馈给的给定状态的所有动作的 Q 值。 在图 9.3 的右侧中也进行了说明。 我们将让代理与环境交互并收集状态和奖励,以此为基础我们将学习 Q 函数。 实际上,网络会通过将给定状态`s`的所有动作![](img/e80900f0-58f0-404b-b333-9afac7b951bd.png)的预测 Q 值与目标 Q 值的预测 Q 值最小化来学习 Q 函数。 每个训练记录都是一个元组`s[t], a[t], r[t], s[t + 1]`
请记住,要根据网络本身计算目标 Q 值。 让我们考虑一个事实,即网络是由`W ∈ R^d`重参数化的,对于给定状态的每个动作,我们学习从状态到 Q 值的映射。 对于`n`组动作![](img/cf95e427-278f-4b63-ada8-cbc875aa51af.png),网络将预测与每个动作有关的`i`Q 值。 映射函数可以表示如下:
......@@ -119,7 +119,7 @@ Q 值表也通过迭代`t`进行索引,因为代理只能查看到目前为止
在上图中,我们可以看到两个网络:网络`A`,可以学习预测给定状态下的实际 Q 值;以及网络`B`,可以帮助计算目标 Q 值。 网络`A`通过最小化目标的损失函数和预测的 Q 值来进行改进。 由于 Q 值通常本质上是连续的,因此一些有效的损失函数为`mean squared error``mean absolute error``Huber Loss``log-cosh loss`等。
网络`B`基本上是网络`A`的副本,因此它们共享相同的体系结构。 通常以指定的时间间隔将网络`A`的权重复制到网络`B`。 这是为了确保不使用同一组网络权重来预测 Q 值,也不会制定目标 Q 值,因为这会导致不稳定的训练。 给定单个训练元组`(s[t] = s, a[t] = a, r[r] = r, s[t + 1] = s')`,网络`A`对所有可能的动作给出状态`s[t] = s`。 由于我们知道实际动作`a[t] = a`,因此我们选择 Q 值`Q[t](s[t] = a, a[t] = a)`。 这将充当我们的预测 Q 值![](img/def6bacb-9f53-4d6f-9766-5f4a67d24943.png)
网络`B`基本上是网络`A`的副本,因此它们共享相同的构。 通常以指定的时间间隔将网络`A`的权重复制到网络`B`。 这是为了确保不使用同一组网络权重来预测 Q 值,也不会制定目标 Q 值,因为这会导致不稳定的训练。 给定单个训练元组`(s[t] = s, a[t] = a, r[r] = r, s[t + 1] = s')`,网络`A`对所有可能的动作给出状态`s[t] = s`。 由于我们知道实际动作`a[t] = a`,因此我们选择 Q 值`Q[t](s[t] = a, a[t] = a)`。 这将充当我们的预测 Q 值![](img/def6bacb-9f53-4d6f-9766-5f4a67d24943.png)
现在,计算目标要困难一些,因为它涉及到两个网络。 我们知道在步骤`t`的任何状态`s[t]`的候选 Q 值是时间`t`的即时奖励`r[t]`,加上给定新状态`s[t + 1]`的在下一步`t + 1`的最大 Q 值。 候选 Q 值可以表示为:
......
......@@ -125,7 +125,7 @@ python CaptchaGenerator.py --outdir_train '/home/santanu/Downloads/Captcha Gener
3.328 min: main_process
```
在下一节中,我们将讨论 CAPTCHA 断路器的卷积神经网络体系结构。
在下一节中,我们将讨论 CAPTCHA 断路器的卷积神经网络构。
# 验证码断路器 CNN 架构
......@@ -436,7 +436,7 @@ SVHN 是一个现实世界的数据集,由于它在对象识别算法中的使
生成器网络将吸收随机噪声,并尝试输出类似于 SVHN 图像的图像作为输出。 随机噪声是`100`维输入向量。 每个维度都是遵循标准正态分布的随机变量,平均值为`0`,标准偏差为`1`
最初的致密层具有`8192`单元,将其重塑为形状为 4 x 4 x 512 的三维张量。 使用`512`滤镜可以将张量视为 4 x 4 图像。 为了增加张量的空间尺寸,我们进行了一系列转置 2D 卷积,步幅为`2`,内核滤波器尺寸为 5 x5。步幅大小决定了转置卷积的缩放比例。 例如,跨度为 2 的跨度将输入图像的每个空间尺寸加倍,然后进行转置卷积,通常会进行批归一化,以实现更好的收敛性。 除了激活层,网络使用`LeakyReLU`作为激活功能。 网络的最终输出是尺寸为 32 x 32 x 3 的图像。
最初的致密层具有`8192`单元,将其重塑为形状为 4 x 4 x 512 的三维张量。 使用`512`滤镜可以将张量视为 4 x 4 图像。 为了增加张量的空间尺寸,我们进行了一系列转置 2D 卷积,步幅为`2`,内核滤波器尺寸为 5 x5。步幅大小决定了转置卷积的缩放比例。 例如,跨度为 2 的跨度将输入图像的每个空间尺寸加倍,然后进行转置卷积,通常会进行批归一化,以实现更好的收敛性。 除了激活层,网络使用`LeakyReLU`作为激活函数。 网络的最终输出是尺寸为 32 x 32 x 3 的图像。
在最后一层中使用`tanh`激活,以便对`[-1,1]`范围内的图像像素值进行标准化。
......@@ -505,7 +505,7 @@ def discriminator(img_dim,alpha=0.2):
图 10.6:鉴别器网络图
鉴别器的输出激活功能为 S 形。 这有助于对来自真实 SVHN 图像的伪生成图像进行二进制分类。
鉴别器的输出激活函数为 S 形。 这有助于对来自真实 SVHN 图像的伪生成图像进行二进制分类。
# 训练 GAN
......
......@@ -14,7 +14,7 @@ Python 是一种编程语言,可提供数据科学领域的各种功能。 在
第 1 章,“回归和分类的集成方法”涵盖了集成方法或算法的应用,以产生模型的准确预测。 我们将通过集成方法来解决回归和分类问题。
第 2 章,“交叉验证和参数调整”探索了各种技术来组合和构建更好的模型。 我们将学习不同的交叉验证方法,包括保持交叉验证和 k 折交叉验证。 我们还将讨论什么是超参数调
第 2 章,“交叉验证和参数调整”探索了各种技术来组合和构建更好的模型。 我们将学习不同的交叉验证方法,包括保持交叉验证和 k 折交叉验证。 我们还将讨论什么是超参数调
第 3 章,“处理特征”,探讨了特征选择方法,降维,PCA 和要素工程。 我们还将研究通过特征工程改进模型的方法。
......
......@@ -31,7 +31,7 @@
# 自举采样
许多集成学习方法都使用一种称为引导抽样的统计技术。 数据集的引导样本是另一个数据集,它是通过对原始数据集中的观测值**随机抽样并替换掉**而获得的。
许多集成学习方法都使用一种称为引导抽样的统计技术。 数据集的引导样本是另一个数据集,它是通过对原始数据集中的观测值**带放回随机抽样**而获得的。
例如,该技术在统计中大量使用。 它用于估计样本统计量的标准误差,例如平均值或标准偏差。
......@@ -76,7 +76,7 @@
让我们通过使用不同的集成学习模型对钻石价格进行实际预测。 [我们将使用钻石数据集(可在此处找到)](https://www.kaggle.com/shivam2503/diamonds)。 除其他功能外,该数据集的价格接近 54,000 钻石。 以下是此数据集中的功能:
* **功能信息**:具有 53,940 行和 10 个变量的数据框
* **特征信息**:具有 53,940 行和 10 个变量的数据框
* **价格**:美元价格
以下是九种预测功能:
......@@ -134,7 +134,7 @@ import pandas as pd
# KNN 模型
**K 最近邻居**[ **KNN**)模型不是整体学习模型,但在简单模型中表现最佳:
**K 最近邻****KNN**)模型不是整体学习模型,但在简单模型中表现最佳:
![](img/49b9ce91-a006-4b09-b2e9-021e1ca3a76e.png)
......@@ -335,4 +335,4 @@ def CMatrix(CM, labels=['pay', 'default']):
在本章中,我们介绍了不同的集成方法,例如引导程序采样,装袋,随机森林和增强方法,并通过一些示例说明了它们的工作原理。 然后,我们将它们用于回归和分类。 对于回归,我们以菱形数据集为例,还训练了一些 KNN 和其他回归模型。 后来,对它们的性能进行了比较。 为了进行分类,我们以信用卡数据集为例。 同样,我们训练了所有回归模型。 我们比较了它们的性能,发现随机森林模型的性能最佳。
在下一章中,我们将研究 k 倍交叉验证和参数调整。 我们将比较具有 K 折交叉验证的不同集成学习模型,然后,我们将使用 K 折交叉验证进行超参数调整。
\ No newline at end of file
在下一章中,我们将研究 k 倍交叉验证和参数调整。 我们将比较具有 K 折交叉验证的不同集成学习模型,然后,我们将使用 K 折交叉验证进行超参数调优。
\ No newline at end of file
......@@ -2,16 +2,16 @@
预测分析涉及对未知事件进行预测。 我们使用它来生成可概括数据的模型。 为此,我们使用一种称为交叉验证的技术。
交叉验证是一种评估技术,用于评估统计分析结果的一种验证技术,该结果可推广到一个独立的数据集,该数据集提供了样本外准确性的度量。 它通过将数据的几个随机分区平均为训练样本和测试样本来完成任务。 它通常通过对参数的几个可能值进行交叉验证并选择给出最低交叉验证平均误差的参数值来进行超参数调
交叉验证是一种评估技术,用于评估统计分析结果的一种验证技术,该结果可推广到一个独立的数据集,该数据集提供了样本外准确性的度量。 它通过将数据的几个随机分区平均为训练样本和测试样本来完成任务。 它通常通过对参数的几个可能值进行交叉验证并选择给出最低交叉验证平均误差的参数值来进行超参数调
交叉验证有两种:穷举性和非穷举性。 K 折是非穷举性交叉验证的一个示例。 这是一种用于对模型性能进行更准确评估的技术。 使用 k 折交叉验证,我们可以进行超参数调整。 这是关于为我们的模型选择最佳的超参数。 k 折交叉验证和超参数调整等技术对于构建出色的预测分析模型至关重要。 交叉验证有很多类型或方法,例如,保持交叉验证和 k 折交叉验证。
交叉验证有两种:穷举性和非穷举性。 K 折是非穷举性交叉验证的一个示例。 这是一种用于对模型性能进行更准确评估的技术。 使用 k 折交叉验证,我们可以进行超参数调优。 这是关于为我们的模型选择最佳的超参数。 k 折交叉验证和超参数调优等技术对于构建出色的预测分析模型至关重要。 交叉验证有很多类型或方法,例如,保持交叉验证和 k 折交叉验证。
在本章中,我们将涵盖以下主题:
* 保持交叉验证
* K 折交叉验证
* 将模型与 k 倍交叉验证进行比较
* 超参数调简介
* 超参数调简介
# 保持交叉验证
......@@ -39,15 +39,15 @@
在 k 倍交叉验证中,观察到评估矩阵的`k`估计后,取其平均值。 这将使我们可以更好地估计模型的性能。 因此,我们可以通过 k 倍交叉验证获得`n`个估计数,而不是仅对这一评估指标进行一次估计,然后取平均值,以获得对性能的更好估计。 该模型。
如此处所示,k 折交叉验证方法的优势在于它不仅可以用于模型评估,而且还可以用于超参数调
如此处所示,k 折交叉验证方法的优势在于它不仅可以用于模型评估,而且还可以用于超参数调
在此验证方法中,`k`的公共值为 5 和 10。
以下是 k 折交叉验证的变体:
* **重复交叉验证:**在重复交叉验证中,我们多次执行 k 倍交叉验证。 因此,如果我们希望对评估指标进行 30 次估算,则可以进行 6 次 5 倍交叉验证。 因此,我们将获得 30 个评估指标的估算值。
* **重复交叉验证**在重复交叉验证中,我们多次执行 k 倍交叉验证。 因此,如果我们希望对评估指标进行 30 次估算,则可以进行 6 次 5 倍交叉验证。 因此,我们将获得 30 个评估指标的估算值。
* **留一法(LOO)交叉验证:**在这种方法中,我们将除一点之外的整个数据集用于训练。 我们将这一点用于评估,然后对数据集中的每个数据点重复此过程。
* **留一法(LOO)交叉验证**在这种方法中,我们将除一点之外的整个数据集用于训练。 我们将这一点用于评估,然后对数据集中的每个数据点重复此过程。
如果我们有数百万个点,则此验证方法的计算量将非常昂贵。 在这种情况下,我们使用重复的 k 倍交叉验证,因为这种验证方法将为我们提供相对较好的结果。
......@@ -91,7 +91,7 @@ y = diamonds[target_name]
这与我们在第 1 章,“回归和分类的集成方法”中使用的单元格相同。 此处的区别在于我们不使用`train_test_split`功能。 在这里,我们正在生成`X`矩阵,该矩阵包含所有功能并具有我们的目标功能。 因此,我们有了`X`矩阵和`y`向量。
为了训练模型,我们将实例化`RandomForestRegressor`函数,该函数在此数据集的第 1 章 ,“回归和分类集成方法”中是最佳模型。 。 以下显示了用于实例化`RandomForestRegressor`函数**的代码:**
为了训练模型,我们将实例化`RandomForestRegressor`函数,该函数在此数据集的第 1 章 ,“回归和分类集成方法”中是最佳模型。 。 以下显示了用于实例化`RandomForestRegressor`函数**代码**
```py
from sklearn.ensemble import RandomForestRegressor
......@@ -238,15 +238,15 @@ boosting_test_mse = cross_validate(estimator=boosting,X=X,y=y,
前面的屏幕截图显示,在这种情况下,最多的模型是 KNN 模型,其次是 boosting 模型,而随机森林模型的变化最小。 因此,随机森林模型是这三种模型中最好的。 即使对于此数据集,随机森林模型也表现最佳。
# 超参数调简介
# 超参数调简介
用于为特定数据集选择最佳估计量或为所有超参数选择最佳值的方法称为**超参数调**。 超参数是无法在估算器中直接学习的参数。 它们的价值由建模者决定。
用于为特定数据集选择最佳估计量或为所有超参数选择最佳值的方法称为**超参数调**。 超参数是无法在估算器中直接学习的参数。 它们的价值由建模者决定。
例如,在`RandomForestClassifier`对象中,有很多超参数,例如`n_estimators``max_depth``max_features``min_samples_split`。 建模人员确定这些超参数的值。
# 详尽的网格搜索
# 穷举网格搜索
执行超参数调的最重要且最常用的方法之一是**穷举网格搜索**。 这是一种蛮力方法,因为它尝试从参数值网格中尝试所有超参数组合。 然后,对于超参数的每种组合,使用 k 倍交叉验证和任何其他指定的指标来评估模型。 因此,为我们提供最佳度量的组合是我们将在`scikit-learn`中使用的对象返回的组合。
执行超参数调的最重要且最常用的方法之一是**穷举网格搜索**。 这是一种蛮力方法,因为它尝试从参数值网格中尝试所有超参数组合。 然后,对于超参数的每种组合,使用 k 倍交叉验证和任何其他指定的指标来评估模型。 因此,为我们提供最佳度量的组合是我们将在`scikit-learn`中使用的对象返回的组合。
让我们以超参数网格为例。 在这里,我们为`n_estimators`超参数尝试三个不同的值,例如 10、30 和 50。 我们将为`max_features`尝试两个选项,例如 auto 和 square root,并为`max_depth`分配四个值-5、10、20 和 30。 因此,在这种情况下,我们将有 24 个超参数组合。 这 24 个将被评估。 在这种情况下,对于这 24 个组合中的每个组合,我们使用十倍交叉验证,计算机将训练和评估 240 个模型。 网格搜索面临的最大缺点是维数的诅咒,这将在以后的章节中介绍。 维数的诅咒从本质上讲意味着,您评估模型的次数将随着参数的数量呈指数增长。
......@@ -256,11 +256,11 @@ boosting_test_mse = cross_validate(estimator=boosting,X=X,y=y,
因此,我们执行训练测试拆分,并使用数据集的一部分来学习模型的超参数。 我们留给测试的部分应该用于最终的模型评估,然后我们使用整个数据集来拟合模型。
# scikit-learn 中的超参数调
# scikit-learn 中的超参数调
让我们以`diamond`数据集为例来了解`scikit-learn`中的超参数调
让我们以`diamond`数据集为例来了解`scikit-learn`中的超参数调
要执行超参数调,我们首先必须导入将要使用的库。 要导入库,我们将使用以下代码:
要执行超参数调,我们首先必须导入将要使用的库。 要导入库,我们将使用以下代码:
```py
import numpy as np
......@@ -322,7 +322,7 @@ RF = RandomForestRegressor(random_state=55, n_jobs=-1)
总共,`n_estimators`有四个值,`max_depth`有四个值,`max_features`有两个值。 因此,在计算中,总共有 32 个超参数组合。
要在`scikit-learn`中执行超参数调,我们将使用`GridSearchCV`对象。 下面显示了用于从`scikit-learn`导入对象的代码:
要在`scikit-learn`中执行超参数调,我们将使用`GridSearchCV`对象。 下面显示了用于从`scikit-learn`导入对象的代码:
```py
from sklearn.model_selection import GridSearchCV
......@@ -380,6 +380,6 @@ RF_tunned_test_mse = mean_squared_error(y_pred=RF_classifier.predict(X_test), y_
在本章中,我们学习了交叉验证以及各种交叉验证方法,包括保持交叉验证和 k 折交叉验证。 我们知道 k 折交叉验证不过是多次进行保持交叉验证而已。 我们使用`diamond`数据集实施了 k 折交叉验证。 我们还使用 k 倍交叉验证比较了不同的模型,并找到了性能最佳的模型,即随机森林模型。
然后,我们讨论了超参数调整。 我们遇到了详尽的网格搜索方法,该方法用于执行超参数调整。 我们再次使用`diamond`数据集实施了超参数调整。 我们还比较了调整后的模型和未调整的模型,发现调整后的参数使模型的性能优于未调整的模型。
然后,我们讨论了超参数调优。 我们遇到了详尽的网格搜索方法,该方法用于执行超参数调优。 我们再次使用`diamond`数据集实施了超参数调优。 我们还比较了调整后的模型和未调整的模型,发现调整后的参数使模型的性能优于未调整的模型。
在下一章中,我们将研究特征选择方法,降维和**主成分分析****PCA**)以及特征工程。 我们还将学习一种通过特征工程改进模型的方法。
\ No newline at end of file
......@@ -358,8 +358,8 @@ RFE 是我们将使用`RandomForestClassifier`模型的第三种技术,请记
在继续进行之前,预测分析要涵盖两个非常重要的概念。 错误可以分为以下两种类型:
* **可减少的错误**:可以通过对模型进行某些改进来减少这些错误
* **无法减少的错误**:完全无法减少这些错误
* **可减少的误差**:可以通过对模型进行某些改进来减少这些错误
* **无法减少的误差**:完全无法减少这些错误
假设在机器学习中,功能与目标之间存在由函数表示的关系,如以下屏幕截图所示:
......@@ -377,7 +377,7 @@ RFE 是我们将使用`RandomForestClassifier`模型的第三种技术,请记
![](img/ba4c0671-5d52-4204-806c-85b9c4ecfcd9.png)
现在,**不可误差**项是该随机项的方差。 您对此词没有任何控制权。 总会有一个不可减少的错误成分。 因此,您的模型总是会出错; 无论您拥有多少个特征和数据点,您的模型都不能总是 100% 正确的。 我们必须尝试使用​​更好和更复杂的方法来执行特征工程,并尝试将我们的估计近似为真实函数。 仅仅因为您使用的是更复杂的模型或您有更多的数据,您的模型就不会是完美的,并且您将无法准确预测`y`是什么,因为几乎所有过程都存在随机性 与您一起工作。 这是一个非常有趣的部分的结尾。
现在,**不可减少的误差**项是该随机项的方差。 您对此词没有任何控制权。 总会有一个不可减少的错误成分。 因此,您的模型总是会出错; 无论您拥有多少个特征和数据点,您的模型都不能总是 100% 正确的。 我们必须尝试使用​​更好和更复杂的方法来执行特征工程,并尝试将我们的估计近似为真实函数。 仅仅因为您使用的是更复杂的模型或您有更多的数据,您的模型就不会是完美的,并且您将无法准确预测`y`是什么,因为几乎所有过程都存在随机性 与您一起工作。 这是一个非常有趣的部分的结尾。
# 概要
......
......@@ -37,19 +37,19 @@
![](img/7938be7f-8c64-4cdd-9d93-b6ba65e4d5a6.png)
如您所见,我们有相同的表格。 如果权重之和乘以特征 **-b** 的值实际上大于`0`,则我们预测`1`,否则,我们预测 **0 [** 。 假设所有特征都在同一尺度上,权重将代表每个特征在做出决策时的重要性。 因此,我们知道对于这个特殊问题,所有功能的比例都非常不同。 例如,年龄与帐单金额的比例不同,但是假设您将所有功能设置为相似的比例。 您可以将`w`变量视为权重,它们是决策时每个功能最重要的部分。
如您所见,我们有相同的表格。 如果权重之和乘以特征`-b`的值实际上大于`0`,则我们预测`1`,否则,我们预测`0`。 假设所有特征都在同一尺度上,权重将代表每个特征在做出决策时的重要性。 因此,我们知道对于这个特殊问题,所有功能的比例都非常不同。 例如,年龄与帐单金额的比例不同,但是假设您将所有功能设置为相似的比例。 您可以将`w`变量视为权重,它们是决策时每个功能最重要的部分。
以下屏幕截图显示了可视化此感知器的另一种方法:
![](img/bd6b7f5e-ef5e-4f6e-aac0-a65a57a01b6b.png)
因此,您具有阈值或偏差`b`的值,并且具有 **Age**`x1`**的值 帐单金额**`x2`。 因此,这三个值进入一个运算,然后得到输出。 现在,我们可以对感知器进行一些修改,这就是添加所谓的**激活函数**。 激活功能是任何可以获取运算结果并使用`f`功能对输入值进行某种转换的功能。 因此,激活函数的输入是来自运算的结果数量,然后在应用激活函数`f`之后,我们将获得以下输出:
因此,您具有阈值或偏差`b`的值,并且具有**年龄**`x1`**帐单金额**`x2`。 因此,这三个值进入一个运算,然后得到输出。 现在,我们可以对感知器进行一些修改,这就是添加所谓的**激活函数**。 激活函数是任何可以获取运算结果并使用`f`功能对输入值进行某种转换的功能。 因此,激活函数的输入是来自运算的结果数量,然后在应用激活函数`f`之后,我们将获得以下输出:
![](img/b2e13ce5-8226-4536-a9c6-c425619c50d0.png)
因此,这是感知器。 我们可以向感知器添加激活函数,然后获得规则或分类`1``0`
现在,也许您想知道我们如何确定感知器的最佳权重和阈值? 我们可以使用什么激活功能? 这些问题的答案由感知器学习算法提供。 因此,有一种学习算法可用于实际训练感知器。 感知器的好处是它们很容易理解。 但是,与更复杂的方法(例如我们在前几章中使用的方法)相比,它们的性能非常弱。 因此,实际上不值得学习这种感知器学​​习算法。 但是,这些非常简单的模型是人工神经网络的基础。
现在,也许您想知道我们如何确定感知器的最佳权重和阈值? 我们可以使用什么激活函数? 这些问题的答案由感知器学习算法提供。 因此,有一种学习算法可用于实际训练感知器。 感知器的好处是它们很容易理解。 但是,与更复杂的方法(例如我们在前几章中使用的方法)相比,它们的性能非常弱。 因此,实际上不值得学习这种感知器学​​习算法。 但是,这些非常简单的模型是人工神经网络的基础。
# 多层感知器
......@@ -79,7 +79,7 @@
# 深度神经网络模型的要素
**深神经网络****DNN**)的动机是相似的,这里的问题是,如果不使用一个隐藏层,那么如果我们使用多个隐藏层怎么办? 因此,在这种情况下,我们的模型将类似于以下内容:
**深神经网络****DNN**)的动机是相似的,这里的问题是,如果不使用一个隐藏层,那么如果我们使用多个隐藏层怎么办? 因此,在这种情况下,我们的模型将类似于以下内容:
![](img/0d594d3c-f5ca-4433-af2c-1299e12ae028.png)
......@@ -99,11 +99,11 @@
在多层感知器中构建深度学习模型时,需要考虑很多因素。 您必须考虑架构,激活函数,优化算法,`loss`函数,权重初始化策略,正则化策略和训练策略。 我们将在以下列表中讨论有关它们的更多信息:
* **体系结构**:构建深度学习模型时,您需要考虑的第一个元素是 MLP 的体系结构。 当我们说架构时,我们在谈论的是层数和每层神经元数。 输入层中神经元的数量由数据集中的要素数量决定。 输出值的数量也是如此。 因此,它们基本上由您在分类设置中的问题确定。 输出值的数量通常是分类问题中的类数,而在回归问题中,输出层中将只有一个输出。 您必须做出的选择是要使用多少个隐藏层以及每个隐藏层的神经元数量。 设置这些数字并不容易。 实际上,我们要做的是首先使用几层。 如果有几层不起作用,也许我们增加更多层,每层的神经元数量就是输入值数量和输出数量`[n_inputs, n_outputs]`之间的数字。
* **架构**:构建深度学习模型时,您需要考虑的第一个元素是 MLP 的架构。 当我们说架构时,我们在谈论的是层数和每层神经元数。 输入层中神经元的数量由数据集中的要素数量决定。 输出值的数量也是如此。 因此,它们基本上由您在分类设置中的问题确定。 输出值的数量通常是分类问题中的类数,而在回归问题中,输出层中将只有一个输出。 您必须做出的选择是要使用多少个隐藏层以及每个隐藏层的神经元数量。 设置这些数字并不容易。 实际上,我们要做的是首先使用几层。 如果有几层不起作用,也许我们增加更多层,每层的神经元数量就是输入值数量和输出数量`[n_inputs, n_outputs]`之间的数字。
这只是一个经验法则。 但是,有更多正式的方法可以选择隐藏层的数量和神经元的数量,研究人员一直在努力寻找更好的方法来选择这些值。
* **激活功能**:激活功能是在隐藏层的每个神经元中使用的功能。 有很多选择。 **乙状结肠**是开发这些模型时使用的第一个功能,但随后研究人员发现使用此功能存在许多问题,因此他们提出了其他激活功能,例如**整流线性单元****ReLU**),**双曲正切****泄漏 ReLU** 以及我们将在进行中的示例中使用的其他一些选择。
* **激活函数**:激活函数是在隐藏层的每个神经元中使用的功能。 有很多选择。 **乙状结肠**是开发这些模型时使用的第一个功能,但随后研究人员发现使用此功能存在许多问题,因此他们提出了其他激活函数,例如**整流线性单元****ReLU**),**双曲正切****泄漏 ReLU** 以及我们将在进行中的示例中使用的其他一些选择。
* **优化算法**:这是用于学习网络权重的算法。 您选择的每种算法都有不同的超参数,建模者需要您选择它们​​。 训练这些网络的最基本算法是**梯度下降**。 但是,梯度下降的速度可能很慢并且存在一些问题,因此研究人员提出了其他算法,例如**动量优化器****AdaGrad****RMSProp****亚当**矩算法。 在 TensorFlow 中,我们可以选择很多算法,包括亚当矩算法,而这实际上是我们将在示例中使用的算法。
* **损失函数**:此函数将产生将由优化器最小化的数量。 损失函数的选择取决于问题。 如果我们正在做回归问题,则可以选择均方误差或均对均方误差。 对于分类问题,有更多选择,例如交叉熵,平方损失和铰链损失。 这类似于反复试验。 有时候,一个损失函数会解决您的问题,有时却不会。 因此,这就是为什么您必须考虑许多不同的损失函数的原因。 但是,请记住,损失函数将产生数量,该数量将用于优化算法,以调整将成为网络一部分的不同感知器的不同权重。 因此,这是将产生数量的函数,优化器的目标是使该数量尽可能小。
......
......@@ -44,8 +44,8 @@ from tensorflow.contrib.layers import fully_connected
在运行模型之前,我们首先必须确定用于构建多层感知器模型的元素。 以下是我们将在此模型中使用的元素:
* **体系结构**:该模型在输入层中包含 728 个神经元。 这是因为我们有 28 个图像,每个图像都有 28 个像素。 这里,在这种情况下,每个像素都是一个特征,因此我们有 728 个像素。 尽管可以使用任意数量的隐藏层,但在输出层中将有 10 个元素,并且还将使用三个隐藏层。 在这里,我们将使用三个隐藏层。 我们将在每一层中使用的神经元数在第一层为 350,第二层为 200,最后一层为 100。
* **激活功能**:我们将使用 ReLU 激活功能,如以下代码块所示:
* **构**:该模型在输入层中包含 728 个神经元。 这是因为我们有 28 个图像,每个图像都有 28 个像素。 这里,在这种情况下,每个像素都是一个特征,因此我们有 728 个像素。 尽管可以使用任意数量的隐藏层,但在输出层中将有 10 个元素,并且还将使用三个隐藏层。 在这里,我们将使用三个隐藏层。 我们将在每一层中使用的神经元数在第一层为 350,第二层为 200,最后一层为 100。
* **激活函数**:我们将使用 ReLU 激活函数,如以下代码块所示:
```py
vector = np.arange(-5,5,0.1)
......@@ -58,7 +58,7 @@ relu = np.vectorize(relu)
![](img/e5bfc50a-2e28-44e0-8cf2-294a24807836.png)
`0`和输入之间获得最大值。 该激活功能将用于隐藏层的每个神经元。
`0`和输入之间获得最大值。 该激活函数将用于隐藏层的每个神经元。
* **优化** **算法**:此处使用的优化算法是学习率为 0.01 的梯度下降。
* **损失函数**:对于`loss`函数,我们将使用`cross_entropy`函数,但是与本书中使用的其他损失函数一样,该函数将测量实际值与测量值之间的距离。 模型做出的预测。
......@@ -79,7 +79,7 @@ relu = np.vectorize(relu)
# 定义架构
我们将使用三个隐藏层,第一层为 256 个神经元,第二层为 128 个,第三层为 64 个。 以下代码段显示了分类示例的体系结构:
我们将使用三个隐藏层,第一层为 256 个神经元,第二层为 128 个,第三层为 64 个。 以下代码段显示了分类示例的构:
```py
n_inputs = 28*28
......@@ -160,8 +160,8 @@ y = tf.placeholder(tf.int64)
在运行模型之前,我们首先必须确定用于构建多层感知器模型的元素,如下所示:
* **体系结构:**该模型在输入层中包含 23 个元素,因此在此数据集中有 25 个要素。 尽管可以使用任意数量的隐藏层,但在输出层中只有一个元素,并且将使用三个隐藏层。 我们将在第一层使用 256 个神经元,第二层使用 128 个神经元,第三层使用 64 个神经元。 这是两个的力量。
* **激活功能:**我们将选择 ReLu 激活功能
* **构:**该模型在输入层中包含 23 个元素,因此在此数据集中有 25 个要素。 尽管可以使用任意数量的隐藏层,但在输出层中只有一个元素,并且将使用三个隐藏层。 我们将在第一层使用 256 个神经元,第二层使用 128 个神经元,第三层使用 64 个神经元。 这是两个的力量。
* **激活函数:**我们将选择 ReLu 激活函数
* **优化** **算法**:这里使用的优化算法是 Adam 优化器。 Adam 优化器是最受欢迎的优化器之一,因为它是解决许多问题的最佳选择。
* **损失函数**:我们将使用均方误差,因为我们在这里进行回归问题,这是`loss`函数的最佳选择之一。
* **权重初始化策略:**为此,我们将使用 Xavier 初始化程序,它是 TensorFlow 中`fully_connected`函数的默认设置。
......@@ -203,7 +203,7 @@ batch_size = 50
# 定义架构
我们使用三个隐藏层,第一层为 256 个神经元,第二层为 128 个,第三层为 64 个。 以下代码段显示了此过程的体系结构:
我们使用三个隐藏层,第一层为 256 个神经元,第二层为 128 个,第三层为 64 个。 以下代码段显示了此过程的构:
```py
n_inputs = X_train.shape[1] #23
......@@ -224,7 +224,7 @@ y = tf.placeholder(y_train.dtype)
# 建立 DNN
为了构建以下示例,我们首先必须定义`DNN`函数。 该功能将获取`X_values`并输出预测。 对于第一个隐藏层,我们使用`fully_ connected`函数。 此隐藏层的输入为`X`,它是来自占位符的数据,而`n_hidden1`是我们在此隐藏层中拥有的神经元数。 请记住,在第一个隐藏层中有 350 个神经元。 现在,第一个隐藏层成为第二个隐藏层的输入,`n_hidden2`是我们在第二个隐藏层中使用的神经元数量。 同样,第二个隐藏层成为第三个隐藏层的输入,我们在这一层中使用此数量的神经元。 最后,我们有了输出层,我们称它为`y_pred`,这是一个全连接层,其中第三个隐藏层为输入。 这是一个输出,该层没有激活功能。 以下屏幕截图显示了用于构建神经网络的代码行:
为了构建以下示例,我们首先必须定义`DNN`函数。 该功能将获取`X_values`并输出预测。 对于第一个隐藏层,我们使用`fully_ connected`函数。 此隐藏层的输入为`X`,它是来自占位符的数据,而`n_hidden1`是我们在此隐藏层中拥有的神经元数。 请记住,在第一个隐藏层中有 350 个神经元。 现在,第一个隐藏层成为第二个隐藏层的输入,`n_hidden2`是我们在第二个隐藏层中使用的神经元数量。 同样,第二个隐藏层成为第三个隐藏层的输入,我们在这一层中使用此数量的神经元。 最后,我们有了输出层,我们称它为`y_pred`,这是一个全连接层,其中第三个隐藏层为输入。 这是一个输出,该层没有激活函数。 以下屏幕截图显示了用于构建神经网络的代码行:
![](img/e509c688-e82a-44e0-a99b-1abce7126c60.png)
......@@ -293,13 +293,13 @@ y = tf.placeholder(y_train.dtype)
在运行模型之前,我们首先必须确定在构建多层感知器模型的
中将使用的元素,如下所示:
* **体系结构**:该模型在输入层中包含 25 个元素,因为我们在数据集中具有
* **构**:该模型在输入层中包含 25 个元素,因为我们在数据集中具有
25 个要素。 在输出层中我们有两个元素,尽管我们可以使用任意数量的隐藏
层,但
也将使用三个隐藏层。 我们将在每层中使用相同数量的神经元,即 200。在这里,我们使用
的 2 的幂进行选择。
* **激活功能**:我们将选择 ELU 激活功能,该功能在上一章中已说明。
* **激活函数**:我们将选择 ELU 激活函数,该功能在上一章中已说明。
* **优化** **算法**:这里使用的优化算法是 Adam
优化器,学习率为 0.001。
* **损失函数**:对于`loss`函数,我们将使用交叉熵函数。
......@@ -352,7 +352,7 @@ batch_size = 100
# 定义架构
我们将对所有三个使用三个隐藏层和 200 个神经元。 以下代码段
显示了本示例中将使用的体系结构:
显示了本示例中将使用的构:
```py
n_inputs = X_train.shape[1] #25
......@@ -382,7 +382,7 @@ TensorFlow,`tf.nn.elu`中获得此功能,从中您可以获得许多功能
![](img/e5e00979-4492-4f24-9bbd-666d6c417cc6.png)
最后一层称为`logits`层。 我们不会在
的这一层中使用任何激活功能
的这一层中使用任何激活函数
# 损失函数
......
# TensorFlow 2.0 入门
本书旨在使读者熟悉 **TensorFlow 2.0****TF 2.0**)中引入的新功能,并在构建机器学习应用程序时使您发挥其潜力。 本章概述了 TF 2.0 中新的体系结构和 API 级别的变化。 我们将介绍 TF 2.0 的安装和设置,并将比较有关 **TensorFlow 1.x****TF 1.x**)的更改,例如 Keras API 和 Layer API。 我们还将涵盖丰富的扩展,例如 TensorFlow 概率,Tensor2Tensor,参差不齐的 Tensors,以及新的针对损失函数的自定义训练逻辑。 本章还总结了对图层 API 和其他 API 的更改。
本书旨在使读者熟悉 **TensorFlow 2.0****TF 2.0**)中引入的新功能,并在构建机器学习应用程序时使您发挥其潜力。 本章概述了 TF 2.0 中新的构和 API 级别的变化。 我们将介绍 TF 2.0 的安装和设置,并将比较有关 **TensorFlow 1.x****TF 1.x**)的更改,例如 Keras API 和 Layer API。 我们还将涵盖丰富的扩展,例如 TensorFlow 概率,Tensor2Tensor,参差不齐的 Tensors,以及新的针对损失函数的自定义训练逻辑。 本章还总结了对图层 API 和其他 API 的更改。
以下主题将...
......@@ -146,7 +146,7 @@ TF 2.0 可以通过两种主要方式使用-使用低级 API 和使用高级 API
# 衣衫 agged 的张量
当训练和服务于机器学习模型时,可变大小的数据很常见。 在不同的基础媒体类型和模型体系结构中,此问题始终存在。 当代的解决方案是使用最大记录的大小,对较小的记录使用填充。 这不仅效率低下,不仅在内存或存储方面,而且在计算效率方面也是如此; 例如,当处理循环模型的输入时。
当训练和服务于机器学习模型时,可变大小的数据很常见。 在不同的基础媒体类型和模型构中,此问题始终存在。 当代的解决方案是使用最大记录的大小,对较小的记录使用填充。 这不仅效率低下,不仅在内存或存储方面,而且在计算效率方面也是如此; 例如,当处理循环模型的输入时。
参差不齐的张量有助于解决此问题。 在非常高的水平上,参差不齐的张量可以被认为是变长链表的 TensorFlow 模拟。 这里要注意的一个重要事实是,这种可变性也可以存在于嵌套尺寸中。 这意味着有可能...
......
......@@ -43,7 +43,7 @@ Keras 是用明确的...
Keras 大致采用了我们刚刚讨论的抽象范式,以帮助用户使用基于神经网络的模型轻松地构建,训练和预测。 在随后的小节中,我们将详细介绍 Keras 为上述任务中的每一项提供的选项。 我们还将探讨使 Keras 成为不可忽视的强大力量的其他辅助功能。
在 Keras 中,模型是通过组合图层来构建的。 每个 Keras 层大致对应于神经网络体系结构中的层。 模型也可以看作是层的组合。 Keras 提供了多种选择来组合这些层以形成基于神经网络的模型。 接下来的两个小节重点介绍 Keras 为构建模型而公开的两种最流行的 API,也称为**数学****统计核心**
在 Keras 中,模型是通过组合图层来构建的。 每个 Keras 层大致对应于神经网络构中的层。 模型也可以看作是层的组合。 Keras 提供了多种选择来组合这些层以形成基于神经网络的模型。 接下来的两个小节重点介绍 Keras 为构建模型而公开的两种最流行的 API,也称为**数学****统计核心**
# Keras 图层 API
......@@ -73,7 +73,7 @@ my_model.add(layer_1)
my_model.add(layer_n)
```
假设您要建立一个描述全连接神经网络的模型(也称为**多层感知器****MLP**)),以对具有五个属性的一维记录进行二进制分类。 我们的模型包括四个全连接层。 纯粹出于说明目的,我们假设每个全连接层包含 10 个节点或神经元。 这些层中的每一层都使用**整流线性单元****ReLU**)激活功能。 最终输出通过`softmax`层获取。 可以在相应层的构造函数中定义特定于层的自定义。 实现此模型的代码如下:
假设您要建立一个描述全连接神经网络的模型(也称为**多层感知器****MLP**)),以对具有五个属性的一维记录进行二进制分类。 我们的模型包括四个全连接层。 纯粹出于说明目的,我们假设每个全连接层包含 10 个节点或神经元。 这些层中的每一层都使用**整流线性单元****ReLU**)激活函数。 最终输出通过`softmax`层获取。 可以在相应层的构造函数中定义特定于层的自定义。 实现此模型的代码如下:
```py
model = tf.keras.Sequential()
......@@ -314,7 +314,7 @@ loaded_model = tf.keras.models.load_model(
# keras.applications 模块
`keras.applications`模块包含具有流行模型权重的预构建体系结构。 这些可以直接用于进行预测。 用户还可以使用它们来创建其他网络的输入功能。 该软件包中突出的预建实现包括:
`keras.applications`模块包含具有流行模型权重的预构建构。 这些可以直接用于进行预测。 用户还可以使用它们来创建其他网络的输入功能。 该软件包中突出的预建实现包括:
* `densenet module`:Keras 的 DenseNet 模型
* `inception_resnet_v2`:Keras 的 Inception-ResNet V2 模型
......@@ -465,6 +465,6 @@ TF 2.0 与 Python 编程语言紧密集成。 急切的执行使张量可以无
# 概要
在本章中,我们了解了 TF 2.0 中可用于模型构建,训练,保存和加载的高级抽象。 深入研究 Keras API,我们了解了如何通过使用`Sequential``functional` API 组合图层来构建模型。 我们还了解了如何利用 Keras API 的高级抽象来训练模型。 本章还研究了在各种配置和模式下加载和保存模型的复杂性。 我们已经了解了保存模型,体系结构和权重的不同方法,本章对每种方法进行了深入的说明,并描述了何时应该选择一种方法。
在本章中,我们了解了 TF 2.0 中可用于模型构建,训练,保存和加载的高级抽象。 深入研究 Keras API,我们了解了如何通过使用`Sequential``functional` API 组合图层来构建模型。 我们还了解了如何利用 Keras API 的高级抽象来训练模型。 本章还研究了在各种配置和模式下加载和保存模型的复杂性。 我们已经了解了保存模型,构和权重的不同方法,本章对每种方法进行了深入的说明,并描述了何时应该选择一种方法。
将讨论的所有概念放在一起...
\ No newline at end of file
......@@ -248,7 +248,7 @@ TF 提供了仅保存模型权重或保存整个模型的灵活性,包括模
# Create checkpoint callbackcp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path, save_weights_only=True, verbose=1)model.fit(train_dataset, epochs=10, callbacks=[cp_callback], validation_data=val_dataset)
```
之前的回调会创建多个 TensorFlow 检查点文件,这些文件会在每次训练完成后进行更新。 此外,要使用这些检查点,请使用与保存检查点的原始模型完全相同的体系结构来重新创建模型,构建模型,然后使用`tf.keras.Model.load_weight(...)` API 从任何检查点加载权重并将其用于评估:
之前的回调会创建多个 TensorFlow 检查点文件,这些文件会在每次训练完成后进行更新。 此外,要使用这些检查点,请使用与保存检查点的原始模型完全相同的构来重新创建模型,构建模型,然后使用`tf.keras.Model.load_weight(...)` API 从任何检查点加载权重并将其用于评估:
```py
model.load_weights(checkpoint_path) ...
......@@ -505,11 +505,11 @@ TensorBoard 的图形仪表板提供可视化和检查 TensorFlow 模型的功
1. 将 TensorBoard 回调添加到`Model.fit`以确保图形数据记录在 TensorBoard 中。
2. 运行后,打开 TensorBoard 并导航到顶部栏上的“图形”选项卡以查看图形。 默认情况下,TensorBoard 显示操作级别图,该图显示...
# 超参数调
# 超参数调
建立良好的深度学习模型最重要的部分之一就是选择最佳超参数来训练模型本身。 超参数是工程师在模型训练之前设置的参数。 一些常见的超参数包括辍学率,学习率和所用优化器的类型。 超参数的优化是一个耗时的过程,其中涉及对具有不同超参数的模型进行多次训练以找到最佳模型,因为目前尚无关于如何选择超参数的见解。
这样,TF 2.0 提供了一种智能执行超参数调的工具,它可以协助确定执行最佳实验和尝试最有前途的超参数的过程。
这样,TF 2.0 提供了一种智能执行超参数调的工具,它可以协助确定执行最佳实验和尝试最有前途的超参数的过程。
为此,请使用以下步骤:
......@@ -558,7 +558,7 @@ for num_units in HP_NUM_UNITS.domain.values:
session_num += 1
```
对于更复杂的超参数调,随机搜索更加有效。 可以通过随机选择每个超参数并运行实验来进行,这可以比网格搜索快得多地探索超参数空间。 也可以使用其他更复杂的算法。
对于更复杂的超参数调,随机搜索更加有效。 可以通过随机选择每个超参数并运行实验来进行,这可以比网格搜索快得多地探索超参数空间。 也可以使用其他更复杂的算法。
3. 最后,可以通过在`logdir`上运行 TensorBoard 来查看超参数日志,日志在其中写入:
......
......@@ -28,7 +28,7 @@ TF 1.x 中的`session.run()`调用与...非常相似。
管理和跟踪变量是 TF 1.x 中另一个复杂的过程。 使用了许多方法来控制和访问这些变量,这为线性代码增加了更多的维度。 TF 2.0 更加强调使用`tf.keras`层和`tf.estimator`模型来管理模型中的变量。
这与手动滚动神经网络层和手动创建变量形成对比。 在以下示例中,必须跟踪权重和偏差变量,其形状的定义应远离模型的创建。 这使得难以更改模型并使模型适应不同的体系结构和数据集:
这与手动滚动神经网络层和手动创建变量形成对比。 在以下示例中,必须跟踪权重和偏差变量,其形状的定义应远离模型的创建。 这使得难以更改模型并使模型适应不同的构和数据集:
```py
def dense(x, W, b):
......@@ -371,9 +371,9 @@ print(' accuracy: {:.3f}'.format(mean_accuracy))
# TF 2.0 的未来
TF 2.0 目前处于 beta 版本,因此仍在开发中。 即将出现的一些关键功能包括对软件包的修改,例如 TensorBoard,TensorFlow Lite,TensorFlow.js,用于 TensorFlow 的 Swift 和 TensorFlow Extended,以及对基本 API 的微小更改。 TensorBoard 将看到增强功能,例如改进的超参数调功能,引入托管功能以使共享仪表板变得容易,并使插件能够使用不同的前端技术,例如 ReactJS。 TensorFlow Lite 将扩大支持的操作范围,将 TF 2.0 模型更轻松地转换为 TFLite,并扩展对 Edge TPU 和 AIY 板的支持。 TensorFlow.js 和用于 TensorFlow 的 Swift 都将看到速度和性能方面的改进,并且很快将包含一组丰富的示例和带有端到端教程的入门指南。 TF Extended 即将与 TF 2.0 基本 API 完全集成,并将包括完全协调的端到端工作流程和培训功能。
TF 2.0 目前处于 beta 版本,因此仍在开发中。 即将出现的一些关键功能包括对软件包的修改,例如 TensorBoard,TensorFlow Lite,TensorFlow.js,用于 TensorFlow 的 Swift 和 TensorFlow Extended,以及对基本 API 的微小更改。 TensorBoard 将看到增强功能,例如改进的超参数调功能,引入托管功能以使共享仪表板变得容易,并使插件能够使用不同的前端技术,例如 ReactJS。 TensorFlow Lite 将扩大支持的操作范围,将 TF 2.0 模型更轻松地转换为 TFLite,并扩展对 Edge TPU 和 AIY 板的支持。 TensorFlow.js 和用于 TensorFlow 的 Swift 都将看到速度和性能方面的改进,并且很快将包含一组丰富的示例和带有端到端教程的入门指南。 TF Extended 即将与 TF 2.0 基本 API 完全集成,并将包括完全协调的端到端工作流程和培训功能。
TF 2.0 基本 API 将包括针对任务的更多预制估算器,例如增强树,随机森林,最近邻搜索和 k 均值聚类。 `tf.distribute.Strategy`模型将扩展其对 Keras 子模型,TPU 和多节点训练的支持,以在多个处理器上实现更优化和更快的训练。
TF 2.0 基本 API 将包括针对任务的更多预制估算器,例如增强树,随机森林,最近邻搜索和 k 均值聚类。 `tf.distribute.Strategy`模型将扩展其对 Keras 子模型,TPU 和多节点训练的支持,以在多个处理器上实现更优化和更快的训练。
当前正在开发的另一个主要附加功能是`tf-agents`模块。 该模块将核心强化学习算法实现为**代理**,该算法定义了与环境进行交互的策略并从集体经验中训练了该策略。 `TF-agents`与 OpenAI Gym 框架一起实现,并抽象了许多用于开发的关键强化学习算法。 该模块当前处于预发布状态,但将于今年晚些时候发布。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册