提交 177dda3c 编写于 作者: W wizardforcel

2020-12-22 21:46:16

上级 fb711f7b
...@@ -93,8 +93,8 @@ $ python3 lesson_1/activity_1/test_stack.py ...@@ -93,8 +93,8 @@ $ python3 lesson_1/activity_1/test_stack.py
您可以按照以下步骤下载代码文件: 您可以按照以下步骤下载代码文件:
1. 使用您的电子邮件地址和密码登录或注册到我们的网站。 1. 使用您的电子邮件地址和密码登录或注册到我们的网站。
2. 将鼠标指针悬停在顶部的 **SUPPORT** 选项卡上。 2. 将鼠标指针悬停在顶部的`SUPPORT`选项卡上。
3. 单击**代码下载** & **勘误表** 3. 单击**代码下载****勘误表**
4.**搜索**框中输入书籍的名称。 4.**搜索**框中输入书籍的名称。
5. 选择您要下载其代码文件的书。 5. 选择您要下载其代码文件的书。
6. 从购买本书的下拉菜单中选择。 6. 从购买本书的下拉菜单中选择。
......
...@@ -21,17 +21,17 @@ ...@@ -21,17 +21,17 @@
### 注意 ### 注意
有关更多信息,请参见*解释:神经网络*。 麻省理工学院新闻办公室,2017 年 4 月 14 日。[可在以下网址访问](http://news.mit.edu/2017/explained-neural-networks-deep-learning-0414) 有关更多信息,请参见《神经网络解释》,[可在以下网址访问](http://news.mit.edu/2017/explained-neural-networks-deep-learning-0414)
受神经科学进步的启发,他们建议创建一个计算机系统,该计算机系统可以重现大脑(人类或其他方式)的工作方式。 其核心思想是作为互连网络工作的计算机系统。 即,具有许多简单组件的系统。 这些组件既可以解释数据,又可以相互影响如何解释数据。 今天仍然保留着相同的核心思想。 受神经科学进步的启发,他们建议创建一个计算机系统,该计算机系统可以重现大脑(人类或其他方式)的工作方式。 其核心思想是作为互连网络工作的计算机系统。 即,具有许多简单组件的系统。 这些组件既可以解释数据,又可以相互影响如何解释数据。 今天仍然保留着相同的核心思想。
深度学习在很大程度上被认为是神经网络的当代研究。 可以将其视为神经网络的当前名称。 主要区别在于,深度学习中使用的神经网络通常比早期的神经网络更大,即具有更多的节点和层。 深度学习算法和应用程序通常需要获得成功的资源,因此使用*一词*来强调其大小和大量相互连接的组件。 深度学习在很大程度上被认为是神经网络的当代研究。 可以将其视为神经网络的当前名称。 主要区别在于,深度学习中使用的神经网络通常比早期的神经网络更大,即具有更多的节点和层。 深度学习算法和应用程序通常需要获得成功的资源,因此使用*深度*一词来强调其大小和大量相互连接的组件。
## 成功的申请 ## 成功的申请
自从 40 年代以一种形式或另一种形式出现以来,一直在研究神经网络。 但是,直到最近,深度学习系统才在大型工业应用中成功使用。 自从 40 年代以一种形式或另一种形式出现以来,一直在研究神经网络。 但是,直到最近,深度学习系统才在大型工业应用中成功使用。
神经网络的当代支持者已在语音识别,语言翻译,图像分类和其他领域取得了巨大的成功。 其当前的突出优势是可用计算能力的显着提高以及**图形处理单元****GPU**)和**张量处理单元**[ **TPU**)比常规 CPU 能够执行更多的同时数学运算,并且数据可用性更高。 神经网络的当代支持者已在语音识别,语言翻译,图像分类和其他领域取得了巨大的成功。 其当前的突出优势是可用计算能力的显着提高以及**图形处理单元****GPU**)和**张量处理单元****TPU**)比常规 CPU 能够执行更多的同时数学运算,并且数据可用性更高。
不同 AlphaGo 算法的功耗。 AlphaGo 是 DeepMind 的一项举措,旨在开发出一系列击败 Go 游戏的算法。 它被认为是深度学习的强大典范。 TPU 是 Google 开发的一种芯片组,用于深度学习程序。 不同 AlphaGo 算法的功耗。 AlphaGo 是 DeepMind 的一项举措,旨在开发出一系列击败 Go 游戏的算法。 它被认为是深度学习的强大典范。 TPU 是 Google 开发的一种芯片组,用于深度学习程序。
...@@ -77,7 +77,7 @@ ...@@ -77,7 +77,7 @@
#### 表示学习 #### 表示学习
用于训练神经网络的数据包含表示形式(也称为*功能*),这些表示形式说明您要解决的问题。 例如,如果有兴趣从图像中识别人脸,则将一组包含人脸的图像中每个像素的颜色值用作起点。 然后,模型将在训练过程中将像素组合在一起,从而不断学习更高级别的表示。 用于训练神经网络的数据包含表示形式(也称为*特征*),这些表示形式说明您要解决的问题。 例如,如果有兴趣从图像中识别人脸,则将一组包含人脸的图像中每个像素的颜色值用作起点。 然后,模型将在训练过程中将像素组合在一起,从而不断学习更高级别的表示。
![Representation Learning](img/image01_01.jpg) ![Representation Learning](img/image01_01.jpg)
...@@ -138,16 +138,16 @@ ...@@ -138,16 +138,16 @@
节点是负责特定操作的,层是用于区分系统不同阶段的节点组。 通常,神经网络具有以下三类类别: 节点是负责特定操作的,层是用于区分系统不同阶段的节点组。 通常,神经网络具有以下三类类别:
* **输入**:接收并首先解释输入数据的位置 * **输入**:接收并首先解释输入数据的位置
* **隐藏**:进行计算的位置,在处理数据时对其进行修改 * **隐藏**:进行计算的位置,在处理数据时对其进行修改
* **输出**:组装并评估输出的位置 * **输出**:组装并评估输出的位置
![Common Components and Operations of Neural Networks](img/image01_02.jpg) ![Common Components and Operations of Neural Networks](img/image01_02.jpg)
图 2:神经网络中最常见的层的图示。 通过 Glosser.ca-自己的作品,文件的衍生物:人工神经网络.svg,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid = 24913461 图 2:神经网络中最常见的层的图示。 通过 Glosser.ca-自己的作品,文件的衍生物:人工神经网络.svg,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid = 24913461
隐藏层是神经网络中最重要的层。 它们被称为*隐藏*,因为在其中生成的表示形式在数据中不可用,但可以从中学习。 在这些层中,神经网络中进行了主要计算。 隐藏层是神经网络中最重要的层。 它们被称为*隐藏*,因为在其中生成的表示形式在数据中不可用,但可以从中学习。 在这些层中,神经网络中进行了主要计算。
节点是网络中表示数据的地方。 有两个与节点关联的值:偏差和权重。 这两个值都影响数据如何由节点表示并传递到其他节点。 当网络*学习时,*它会有效地调整这些值以满足优化功能。 节点是网络中表示数据的地方。 有两个与节点关联的值:偏差和权重。 这两个值都影响数据如何由节点表示并传递到其他节点。 当网络*学习*时,它会有效地调整这些值以满足优化功能。
神经网络中的大部分工作都发生在隐藏层中。 不幸的是,没有明确的规则来确定网络应具有多少层或节点。 在实现神经网络时,人们可能会花费时间来尝试不同的层和节点组合。 建议始终从单个图层开始,并且总是以反映输入数据具有的要素数量(即,数据集中有多少*列*可用)的数量的节点开始。 然后,将继续添加层和节点,直到获得令人满意的性能-或每当网络开始过度适应训练数据时。 神经网络中的大部分工作都发生在隐藏层中。 不幸的是,没有明确的规则来确定网络应具有多少层或节点。 在实现神经网络时,人们可能会花费时间来尝试不同的层和节点组合。 建议始终从单个图层开始,并且总是以反映输入数据具有的要素数量(即,数据集中有多少*列*可用)的数量的节点开始。 然后,将继续添加层和节点,直到获得令人满意的性能-或每当网络开始过度适应训练数据时。
...@@ -165,7 +165,7 @@ ...@@ -165,7 +165,7 @@
# 配置深度学习环境 # 配置深度学习环境
在完成本课程之前,我们希望您与真实的神经网络进行交互。 我们将首先介绍本书中使用的主要软件组件,并确保已正确安装它们。 然后,我们将探索一个预训练的神经网络,并探索*前面讨论的一些组件和操作。什么是神经网络?* 部分 在完成本课程之前,我们希望您与真实的神经网络进行交互。 我们将首先介绍本书中使用的主要软件组件,并确保已正确安装它们。 然后,我们将探索一个预训练的神经网络,并探索前面“什么是神经网络”部分讨论的一些组件和操作
## 深度学习的软件组件 ## 深度学习的软件组件
...@@ -203,7 +203,7 @@ TensorBoard 是用于探索 TensorFlow 模型的数据可视化套件,并与 T ...@@ -203,7 +203,7 @@ TensorBoard 是用于探索 TensorFlow 模型的数据可视化套件,并与 T
### 注意 ### 注意
Michael Heydt(2017 年 6 月,Packt 出版)的*学习熊猫*和 Dan Toomey(2016 年 11 月,Packt 出版)的 *Learning Jupyter* 提供了有关如何使用这些技术的全面指南。 这些书是继续学习的好参考。 Michael Heydt 的《学习 Pandas》和 Dan Toomey 的《学习 Jupyter》提供了有关如何使用这些技术的全面指南。 这些书是继续学习的好参考。
<colgroup class="calibre28"><col class="calibre29"> <col class="calibre29"> <col class="calibre29"></colgroup> <colgroup class="calibre28"><col class="calibre29"> <col class="calibre29"> <col class="calibre29"></colgroup>
| |
...@@ -320,7 +320,7 @@ Michael Heydt(2017 年 6 月,Packt 出版)的*学习熊猫*和 Dan Toomey ...@@ -320,7 +320,7 @@ Michael Heydt(2017 年 6 月,Packt 出版)的*学习熊猫*和 Dan Toomey
##### MNIST 数据集 ##### MNIST 数据集
**修改后的美国国家标准技术研究院****MNIST**)数据集包含 60,000 张图像的训练集和 10,000 张图像的测试集。 每个图像都包含一个手写数字。 该数据集(是美国政府创建的数据集的衍生产品)最初用于测试解决计算机系统识别手写文本问题的不同方法。 为了提高邮政服务,税收系统和政府服务的绩效,能够做到这一点很重要。 对于现代方法,MNIST 数据集被认为过于幼稚。 在现代研究中(例如 CIFAR)使用了不同的和更新的数据集。 但是,MNIST 数据集对于了解神经网络的工作原理仍然非常有用,因为已知的模型可以高效地达到很高的准确性。 **国家标准技术混合研究所****MNIST**)数据集包含 60,000 张图像的训练集和 10,000 张图像的测试集。 每个图像都包含一个手写数字。 该数据集(是美国政府创建的数据集的衍生产品)最初用于测试解决计算机系统识别手写文本问题的不同方法。 为了提高邮政服务,税收系统和政府服务的绩效,能够做到这一点很重要。 对于现代方法,MNIST 数据集被认为过于幼稚。 在现代研究中(例如 CIFAR)使用了不同的和更新的数据集。 但是,MNIST 数据集对于了解神经网络的工作原理仍然非常有用,因为已知的模型可以高效地达到很高的准确性。
### 注意 ### 注意
...@@ -334,7 +334,7 @@ CIFAR 数据集是机器学习数据集,其中包含按不同类别组织的 ...@@ -334,7 +334,7 @@ CIFAR 数据集是机器学习数据集,其中包含按不同类别组织的
现在,让我们训练一个神经网络,以使用 MNIST 数据集识别新数字。 现在,让我们训练一个神经网络,以使用 MNIST 数据集识别新数字。
我们将实现称为“卷积神经网络”的专用神经网络来解决这个问题(我们将在后面的部分中详细讨论)。 我们的网络包含三个隐藏层:两个完全连接的层和一个卷积层。 **卷积层**由以下 Python 代码的 TensorFlow 代码段定义:: 我们将实现称为“卷积神经网络”的专用神经网络来解决这个问题(我们将在后面的部分中详细讨论)。 我们的网络包含三个隐藏层:两个全连接层和一个卷积层。 **卷积层**由以下 Python 代码的 TensorFlow 代码段定义::
```py ```py
W = tf.Variable( W = tf.Variable(
...@@ -377,7 +377,7 @@ CIFAR 数据集是机器学习数据集,其中包含按不同类别组织的 ...@@ -377,7 +377,7 @@ CIFAR 数据集是机器学习数据集,其中包含按不同类别组织的
请在`Code/Lesson-1/activity_2/`中使用`mnist.py`文件作为参考。 在代码编辑器中打开脚本。 请在`Code/Lesson-1/activity_2/`中使用`mnist.py`文件作为参考。 在代码编辑器中打开脚本。
在这里,我们还有两个 TensorFlow 变量`W``B`。 请注意,这些变量的初始化非常简单:`W`被初始化为修剪后的高斯分布(修剪过`size_in``size_out`)的随机值,标准偏差为`0.1,``B`( 术语)初始化为`0.1`(常数)。 这两个值在每次运行期间都会不断变化。 该代码段执行两次,产生两个完全连接的网络-一个将数据传递到另一个。 在这里,我们还有两个 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 是数十年来神经网络研究的高潮。
...@@ -409,7 +409,7 @@ CIFAR 数据集是机器学习数据集,其中包含按不同类别组织的 ...@@ -409,7 +409,7 @@ CIFAR 数据集是机器学习数据集,其中包含按不同类别组织的
###### 使用看不见的数据测试网络性能 ###### 使用看不见的数据测试网络性能
在浏览器中访问[网站](http://mnist-demo.herokuapp.com/)并在`0`**之间绘制一个数字 9** 在指定的白框中 在浏览器中访问[网站](http://mnist-demo.herokuapp.com/)并在指定的白框中,绘制一个`0``9`之间的数字
![Testing Network Performance with Unseen Data](img/image01_06.jpg) ![Testing Network Performance with Unseen Data](img/image01_06.jpg)
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
## 通用架构 ## 通用架构
考虑到有许多种可能的架构,经常被用作两种应用的两种流行架构:**卷积神经网络****CNN**)和 **递归神经网络****RNN**)。 这些是基本的网络,应该被视为大多数项目的起点。 由于它们在该领域中的相关性,我们还包括了另外三个网络的描述: **RNN 变体的长期短期记忆****LSTM**)网络; **生成对抗网络****GAN**); 和深度强化学习。 后面的这些体系结构在解决当代问题方面取得了巨大的成功,但是使用起来有些困难。 考虑到有许多种可能的架构,经常被用作两种应用的两种流行架构:**卷积神经网络****CNN**)和 **循环神经网络****RNN**)。 这些是基本的网络,应该被视为大多数项目的起点。 由于它们在该领域中的相关性,我们还包括了另外三个网络的描述: **RNN 变体的长短期记忆****LSTM**)网络; **生成对抗网络****GAN**); 和深度强化学习。 后面的这些体系结构在解决当代问题方面取得了巨大的成功,但是使用起来有些困难。
### 卷积神经网络 ### 卷积神经网络
...@@ -39,13 +39,13 @@ CNN 的基本见解是将紧密相关的数据用作培训过程的要素,而 ...@@ -39,13 +39,13 @@ CNN 的基本见解是将紧密相关的数据用作培训过程的要素,而
有关更多信息,请参考[《通过深度强化学习进行人类水平控制》](https://storage.googleapis.com/deepmind-media/dqn/DQNNaturePaper.pdf) 有关更多信息,请参考[《通过深度强化学习进行人类水平控制》](https://storage.googleapis.com/deepmind-media/dqn/DQNNaturePaper.pdf)
### 递归神经网络 ### 循环神经网络
卷积神经网络与一组输入一起工作,这些输入不断改变网络各个层和节点的权重和偏差。 这种方法的一个已知局限性是,在确定如何更改网络的权重和偏差时,其体系结构会忽略这些输入的顺序。 卷积神经网络与一组输入一起工作,这些输入不断改变网络各个层和节点的权重和偏差。 这种方法的一个已知局限性是,在确定如何更改网络的权重和偏差时,其体系结构会忽略这些输入的顺序。
专门创建了递归神经网络来解决该问题。 RNN 旨在处理顺序数据。 这意味着在每个时期,各层都会受到先前层的输出的影响。 给定序列中的先前观测值的记忆在后验观测值的评估中起作用。 专门创建了循环神经网络来解决该问题。 RNN 旨在处理顺序数据。 这意味着在每个时期,各层都会受到先前层的输出的影响。 给定序列中的先前观测值的记忆在后验观测值的评估中起作用。
由于该问题的顺序性质,RNN 已在语音识别中成功应用。 此外,它们还用于翻译问题。 Google Translate 当前的算法 **Transformer** 使用 RNN 将文本从一种语言翻译成另一种语言。 由于该问题的顺序性质,RNN 已在语音识别中成功应用。 此外,它们还用于翻译问题。 Google Translate 当前的算法**转换器**使用 RNN 将文本从一种语言翻译成另一种语言。
### 注意 ### 注意
...@@ -57,7 +57,7 @@ CNN 的基本见解是将紧密相关的数据用作培训过程的要素,而 ...@@ -57,7 +57,7 @@ CNN 的基本见解是将紧密相关的数据用作培训过程的要素,而
图 2 根据单词在句子中的位置显示英语单词与法语单词相关。 RNN 在语言翻译问题中非常受欢迎。 图 2 根据单词在句子中的位置显示英语单词与法语单词相关。 RNN 在语言翻译问题中非常受欢迎。
长期短期存储网络是为解决消失的梯度问题而创建的 RNN 变体。 逐渐消失的梯度问题是由与当前步骤相距太远的内存组件引起的,并且由于它们的距离而将获得较低的权重。 LSTM 是 RNN 的变体,其中包含一个称为 **忘记门**的内存组件。 该组件可用于评估最新元素和旧元素如何影响权重和偏差,具体取决于观察值在序列中的位置。 长期短期存储网络是为解决消失的梯度问题而创建的 RNN 变体。 逐渐消失的梯度问题是由与当前步骤相距太远的内存组件引起的,并且由于它们的距离而将获得较低的权重。 LSTM 是 RNN 的变体,其中包含一个称为**遗忘门**的内存组件。 该组件可用于评估最新元素和旧元素如何影响权重和偏差,具体取决于观察值在序列中的位置。
### 注意 ### 注意
...@@ -113,7 +113,7 @@ GAN 已成功用于数据具有清晰拓扑结构的领域。 它的原始实现 ...@@ -113,7 +113,7 @@ GAN 已成功用于数据具有清晰拓扑结构的领域。 它的原始实现
| |
| --- | --- | --- | | --- | --- | --- |
| 卷积神经网络(CNN) | 网格状的拓扑结构(即图像) | 图像识别与分类 | | 卷积神经网络(CNN) | 网格状的拓扑结构(即图像) | 图像识别与分类 |
| 递归神经网络(RNN)和长期短期记忆(LSTM)网络 | 顺序数据(即时间序列数据) | 语音识别,文本生成和翻译 | | 循环神经网络(RNN)和长短期记忆(LSTM)网络 | 顺序数据(即时间序列数据) | 语音识别,文本生成和翻译 |
| 生成对抗网络(GAN) | 网格状的拓扑结构(即图像) | 图像生成 | | 生成对抗网络(GAN) | 网格状的拓扑结构(即图像) | 图像生成 |
| 深度强化学习(DRL) | 规则明确,奖励功能明确的系统 | 玩电子游戏和自动驾驶汽车 | | 深度强化学习(DRL) | 规则明确,奖励功能明确的系统 | 玩电子游戏和自动驾驶汽车 |
...@@ -163,7 +163,7 @@ GAN 已成功用于数据具有清晰拓扑结构的领域。 它的原始实现 ...@@ -163,7 +163,7 @@ GAN 已成功用于数据具有清晰拓扑结构的领域。 它的原始实现
在这里,![Maximum and Minimum Normalization](img/image02_11.jpg)是![Maximum and Minimum Normalization](img/image02_12.jpg)观测值,`O`表示具有所有 O 值的向量,并且函数 min(O)和 max(O)分别表示该序列的最小值和最大值 。 在这里,![Maximum and Minimum Normalization](img/image02_11.jpg)是![Maximum and Minimum Normalization](img/image02_12.jpg)观测值,`O`表示具有所有 O 值的向量,并且函数 min(O)和 max(O)分别表示该序列的最小值和最大值 。
*活动 3**探索比特币数据集并为模型准备数据时,*我们将准备可用的比特币数据以用于我们的 LSTM 模式。 其中包括选择感兴趣的变量,选择相关时段并应用先前的点相对归一化技术。 “活动 3”,“探索比特币数据集并为模型准备数据”中,我们将准备可用的比特币数据以用于我们的 LSTM 模式。 其中包括选择感兴趣的变量,选择相关时段并应用先前的点相对归一化技术。
## 解决问题 ## 解决问题
...@@ -173,13 +173,13 @@ GAN 已成功用于数据具有清晰拓扑结构的领域。 它的原始实现 ...@@ -173,13 +173,13 @@ GAN 已成功用于数据具有清晰拓扑结构的领域。 它的原始实现
* **我有正确的数据吗?** 这是训练深度学习模型时最困难的挑战。 首先,用数学规则定义问题。 使用精确的定义并按类别(分类问题)或连续规模(回归问题)组织问题。 现在,您如何收集有关这些指标的数据? * **我有正确的数据吗?** 这是训练深度学习模型时最困难的挑战。 首先,用数学规则定义问题。 使用精确的定义并按类别(分类问题)或连续规模(回归问题)组织问题。 现在,您如何收集有关这些指标的数据?
* **我有足够的数据吗?** 通常,深度学习算法在大型数据集中表现出比在小型数据集中更好的性能。 了解训练高性能算法所需的数据量取决于您要解决的问题类型,但目的是要收集尽可能多的数据。 * **我有足够的数据吗?** 通常,深度学习算法在大型数据集中表现出比在小型数据集中更好的性能。 了解训练高性能算法所需的数据量取决于您要解决的问题类型,但目的是要收集尽可能多的数据。
* **我可以使用预先训练的模型吗?** 如果您要解决的问题是更一般的应用程序的子集(但在同一领域内),请考虑使用预先训练的模型。 预先训练的模型可以让您抢先解决特定问题的模式,而不是整个领域的更一般特征。 [正式的 TensorFlow 仓库](https://github.com/tensorflow/models)是一个不错的起点。 * **我可以使用预训练的模型吗?** 如果您要解决的问题是更一般的应用程序的子集(但在同一领域内),请考虑使用预训练的模型。 预训练的模型可以让您抢先解决特定问题的模式,而不是整个领域的更一般特征。 [正式的 TensorFlow 仓库](https://github.com/tensorflow/models)是一个不错的起点。
![Structuring Your Problem](img/Lesson-2-Algorithm.jpg) ![Structuring Your Problem](img/Lesson-2-Algorithm.jpg)
图 5:在深度学习项目开始时要做出的关键思考问题的决策树 图 5:在深度学习项目开始时要做出的关键思考问题的决策树
在某些情况下,可能根本无法获得数据。 根据情况,可能可以使用一系列技术从输入数据中有效创建更多数据。 此过程称为,称为**数据增强**,在处理图像识别问题时已成功应用。 在某些情况下,可能根本无法获得数据。 根据情况,可能可以使用一系列技术从输入数据中有效创建更多数据。 此过程称为**数据扩充**,在处理图像识别问题时已成功应用。
### 注意 ### 注意
...@@ -347,7 +347,7 @@ Keras 提供了直观的类来表示这些组件中的每个组件: ...@@ -347,7 +347,7 @@ Keras 提供了直观的类来表示这些组件中的每个组件:
| 完整的顺序神经网络的高级抽象。 | `keras.models.Sequential()` | | 完整的顺序神经网络的高级抽象。 | `keras.models.Sequential()` |
| 密集的全连接层。 | `keras.layers.core.Dense()` | | 密集的全连接层。 | `keras.layers.core.Dense()` |
| 激活功能。 | `keras.layers.core.Activation()` | | 激活功能。 | `keras.layers.core.Activation()` |
| LSTM 递归神经网络。 此类包含此体系结构专有的组件,其中大多数由 Keras 抽象。 | `keras.layers.recurrent.LSTM()` | | LSTM 循环神经网络。 此类包含此体系结构专有的组件,其中大多数由 Keras 抽象。 | `keras.layers.recurrent.LSTM()` |
> 表 3:Keras API 中的关键组件说明。 我们将使用这些组件来构建深度学习模型。 > 表 3:Keras API 中的关键组件说明。 我们将使用这些组件来构建深度学习模型。
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
这两个类别中的问题具有以下特性: 这两个类别中的问题具有以下特性:
* **分类**:以类别为特征的问题。 类别可以不同,也可以不同。 它们也可能是关于二进制问题的。 但是,必须将它们明确分配给每个数据元素。 分类问题的一个示例是使用卷积神经网络将标签*汽车**而非汽车*分配给图像。 “第 1 课”,“神经网络和深度学习简介”中探讨的 MNIST 示例是分类问题的另一个示例。 * **分类**:以类别为特征的问题。 类别可以不同,也可以不同。 它们也可能是关于二进制问题的。 但是,必须将它们明确分配给每个数据元素。 分类问题的一个示例是使用卷积神经网络将标签*汽车**而非汽车*分配给图像。 “第 1 课”,“神经网络和深度学习简介”中探讨的 MNIST 示例是分类问题的另一个示例。
* **回归**:以连续变量(即标量)为特征的问题。 这些问题的测量范围是,其评估考虑的是网络与实际值的接近程度。 一个示例是时间序列分类问题,其中使用递归神经网络预测未来温度值。 比特币价格预测问题是回归问题的另一个示例。 * **回归**:以连续变量(即标量)为特征的问题。 这些问题的测量范围是,其评估考虑的是网络与实际值的接近程度。 一个示例是时间序列分类问题,其中使用循环神经网络预测未来温度值。 比特币价格预测问题是回归问题的另一个示例。
虽然对于这两个问题类别,评估这些模型的总体结构是相同的,但我们采用了不同的技术来评估模型的表现。 在以下部分中,我们将探讨用于分类或回归问题的这些技术。 虽然对于这两个问题类别,评估这些模型的总体结构是相同的,但我们采用了不同的技术来评估模型的表现。 在以下部分中,我们将探讨用于分类或回归问题的这些技术。
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
TensorFlow 是 Google 流行的机器学习和深度学习产品。 它已迅速成为执行快速,高效和准确的深度学习任务的工具的流行选择。 TensorFlow 是 Google 流行的机器学习和深度学习产品。 它已迅速成为执行快速,高效和准确的深度学习任务的工具的流行选择。
这本书向您展示了现实世界项目的实际实现,并教您如何利用 TensorFlow 的功能执行高效的深度学习。 在本书中,您将了解执行深度学习的不同范例,例如深度神经网络,卷积神经网络,递归神经网络等等,以及如何使用 TensorFlow 实施它们。 这本书向您展示了现实世界项目的实际实现,并教您如何利用 TensorFlow 的功能执行高效的深度学习。 在本书中,您将了解执行深度学习的不同范例,例如深度神经网络,卷积神经网络,循环神经网络等等,以及如何使用 TensorFlow 实施它们。
这将在自然语言处理,图像分类和欺诈检测等热门话题领域的三个真实项目的端到端实施的帮助下进行演示。 这将在自然语言处理,图像分类和欺诈检测等热门话题领域的三个真实项目的端到端实施的帮助下进行演示。
......
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
现在,我们将看到一种有趣的元学习算法,称为学习通过梯度下降学习梯度下降。 这个名字不是很令人生畏吗? 好吧,事实上,它是最简单的元学习算法之一。 我们知道,在元学习中,我们的目标是元学习过程。 通常,我们如何训练神经网络? 我们通过计算损耗并通过梯度下降使损耗最小化来训练我们的网络。 因此,我们使用梯度下降来优化模型。 除了使用梯度下降,我们还能自动学习此优化过程吗? 现在,我们将看到一种有趣的元学习算法,称为学习通过梯度下降学习梯度下降。 这个名字不是很令人生畏吗? 好吧,事实上,它是最简单的元学习算法之一。 我们知道,在元学习中,我们的目标是元学习过程。 通常,我们如何训练神经网络? 我们通过计算损耗并通过梯度下降使损耗最小化来训练我们的网络。 因此,我们使用梯度下降来优化模型。 除了使用梯度下降,我们还能自动学习此优化过程吗?
但是我们如何学习呢? 我们用**递归神经网络****RNN**)取代了传统的优化器(梯度下降)。 但这如何工作? 如何用 RNN 代替梯度下降? 如果您仔细研究,我们在梯度下降中到底在做什么? 这基本上是从输出层到输入层的一系列更新,我们将这些更新存储在一个状态中。 因此,我们可以使用 RNN 并将更新存储在 RNN 单元中。 但是我们如何学习呢? 我们用**循环神经网络****RNN**)取代了传统的优化器(梯度下降)。 但这如何工作? 如何用 RNN 代替梯度下降? 如果您仔细研究,我们在梯度下降中到底在做什么? 这基本上是从输出层到输入层的一系列更新,我们将这些更新存储在一个状态中。 因此,我们可以使用 RNN 并将更新存储在 RNN 单元中。
因此,该算法的主要思想是用 RNN 代替梯度下降。 但是问题是 RNN 如何学习? 我们如何优化 RNN? 为了优化 RNN,我们使用梯度下降。 **因此,简而言之,我们正在学习通过 RNN 执行梯度下降,并且 RNN 通过梯度下降进行了优化,这就是所谓的通过梯度下降学习梯度下降的名称。** 因此,该算法的主要思想是用 RNN 代替梯度下降。 但是问题是 RNN 如何学习? 我们如何优化 RNN? 为了优化 RNN,我们使用梯度下降。 **因此,简而言之,我们正在学习通过 RNN 执行梯度下降,并且 RNN 通过梯度下降进行了优化,这就是所谓的通过梯度下降学习梯度下降的名称。**
...@@ -108,11 +108,11 @@ ...@@ -108,11 +108,11 @@
因此,我们可以使用 LSTM 作为优化器,而不是在少数学习机制中使用梯度下降作为优化器。 我们的元学习者是 LSTM,它学习用于训练模型的更新规则。 因此,我们使用两个网络:一个是我们的基础学习者,它学习执行任务,另一个是元学习者,它试图找到最佳参数。 但这如何工作? 因此,我们可以使用 LSTM 作为优化器,而不是在少数学习机制中使用梯度下降作为优化器。 我们的元学习者是 LSTM,它学习用于训练模型的更新规则。 因此,我们使用两个网络:一个是我们的基础学习者,它学习执行任务,另一个是元学习者,它试图找到最佳参数。 但这如何工作?
我们知道,在 LSTM 中,我们使用了一个“忘记门”来丢弃内存中不需要的信息,它可以表示为: 我们知道,在 LSTM 中,我们使用了一个“遗忘门”来丢弃内存中不需要的信息,它可以表示为:
![](img/884773a0-e60d-4404-9177-6fe069a63c92.png) ![](img/884773a0-e60d-4404-9177-6fe069a63c92.png)
这个忘记门在我们的优化设置中如何发挥作用? 假设我们处于损耗高的位置,并且梯度接近零。 我们如何摆脱这个位置? 在这种情况下,我们可以缩小模型的参数,而忽略其先前值的某些部分。 因此,我们可以使用我们的忘记门做到这一点,它将当前参数值![](img/b61b56ff-e745-4c19-9920-8ad592f932a8.png),电流损耗![](img/fcd508aa-be72-4b3b-8679-f334163f75d2.png),电流梯度![](img/d93f071a-baca-4701-a998-b518ee5f39d1.png)和先前的忘记门作为输入; 它可以表示如下: 这个遗忘门在我们的优化设置中如何发挥作用? 假设我们处于损耗高的位置,并且梯度接近零。 我们如何摆脱这个位置? 在这种情况下,我们可以缩小模型的参数,而忽略其先前值的某些部分。 因此,我们可以使用我们的遗忘门做到这一点,它将当前参数值![](img/b61b56ff-e745-4c19-9920-8ad592f932a8.png),电流损耗![](img/fcd508aa-be72-4b3b-8679-f334163f75d2.png),电流梯度![](img/d93f071a-baca-4701-a998-b518ee5f39d1.png)和先前的遗忘门作为输入; 它可以表示如下:
![](img/38abac4c-e8fb-4232-95c4-7ae6be154f71.png) ![](img/38abac4c-e8fb-4232-95c4-7ae6be154f71.png)
......
...@@ -21,7 +21,7 @@ NTM 是一种有趣的算法,能够存储和检索内存中的信息。 NTM ...@@ -21,7 +21,7 @@ NTM 是一种有趣的算法,能够存储和检索内存中的信息。 NTM
NTM 的重要组成部分如下: NTM 的重要组成部分如下:
* **控制器**:这基本上是前馈神经网络或递归神经网络。 它从内存中读取和写入。 * **控制器**:这基本上是前馈神经网络或循环神经网络。 它从内存中读取和写入。
* **内存**:我们将在其中存储信息的存储矩阵或存储库,或简称为存储。 内存基本上是由内存单元组成的二维矩阵。 存储器矩阵包含`N`行和`M`列。 使用控制器,我们可以从内存中访问内容。 因此,控制器从外部环境接收输入,并通过与存储矩阵进行交互来发出响应。 * **内存**:我们将在其中存储信息的存储矩阵或存储库,或简称为存储。 内存基本上是由内存单元组成的二维矩阵。 存储器矩阵包含`N`行和`M`列。 使用控制器,我们可以从内存中访问内容。 因此,控制器从外部环境接收输入,并通过与存储矩阵进行交互来发出响应。
* **读写头**:读写头是包含必须从其读取和写入的存储器地址的指针。 * **读写头**:读写头是包含必须从其读取和写入的存储器地址的指针。
......
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
# 第 5 章:记忆增强神经网络 # 第 5 章:记忆增强神经网络
1. NTM 是一种有趣的算法,能够存储和检索内存中的信息。 NTM 的想法是通过外部存储器来增强神经网络-也就是说,它不是使用隐藏状态作为存储器,而是使用外部存储器来存储和检索信息。 1. NTM 是一种有趣的算法,能够存储和检索内存中的信息。 NTM 的想法是通过外部存储器来增强神经网络-也就是说,它不是使用隐藏状态作为存储器,而是使用外部存储器来存储和检索信息。
2. 控制器基本上是前馈神经网络或递归神经网络。 它从内存读取和写入。 2. 控制器基本上是前馈神经网络或循环神经网络。 它从内存读取和写入。
3. 读头和写头是包含其必须读取和写入的内存地址的指针。 3. 读头和写头是包含其必须读取和写入的内存地址的指针。
4. 内存矩阵或内存库,或者简称为内存,是我们存储信息的地方。 内存基本上是由内存单元组成的二维矩阵。 内存矩阵包含`N`行和`M`列。 使用控制器,我们可以从内存中访问内容。 因此,控制器从外部环境接收输入,并通过与存储矩阵进行交互来发出响应。 4. 内存矩阵或内存库,或者简称为内存,是我们存储信息的地方。 内存基本上是由内存单元组成的二维矩阵。 内存矩阵包含`N`行和`M`列。 使用控制器,我们可以从内存中访问内容。 因此,控制器从外部环境接收输入,并通过与存储矩阵进行交互来发出响应。
5. 基于位置的寻址和基于内容的寻址是 NTM 中使用的不同类型的寻址机制。 5. 基于位置的寻址和基于内容的寻址是 NTM 中使用的不同类型的寻址机制。
......
# 深度学习基础 # 深度学习基础
到目前为止,我们已经了解了**强化学习****RL**)的工作原理。 在接下来的章节中,我们将学习**深度强化学习****DRL**),它是深度学习和 RL 的结合。 DRL 在 RL 社区引起了很多关注,并且对解决许多 RL 任务产生了严重影响。 要了解 DRL,我们需要在深度学习方面有坚实的基础。 深度学习实际上是机器学习的一个子集,并且全都与神经网络有关。 深度学习已经存在了十年,但是之所以现在如此流行,是因为计算的进步和海量数据的可用性。 拥有如此庞大的数据量,深度学习算法将胜过所有经典的机器学习算法。 因此,在本章中,我们将学习几种深度学习算法,例如**递归神经网络****RNN**),**长短期记忆****LSTM**)和**卷积神经网络****CNN**)算法及其应用。 到目前为止,我们已经了解了**强化学习****RL**)的工作原理。 在接下来的章节中,我们将学习**深度强化学习****DRL**),它是深度学习和 RL 的结合。 DRL 在 RL 社区引起了很多关注,并且对解决许多 RL 任务产生了严重影响。 要了解 DRL,我们需要在深度学习方面有坚实的基础。 深度学习实际上是机器学习的一个子集,并且全都与神经网络有关。 深度学习已经存在了十年,但是之所以现在如此流行,是因为计算的进步和海量数据的可用性。 拥有如此庞大的数据量,深度学习算法将胜过所有经典的机器学习算法。 因此,在本章中,我们将学习几种深度学习算法,例如**循环神经网络****RNN**),**长短期记忆****LSTM**)和**卷积神经网络****CNN**)算法及其应用。
在本章中,您将了解以下内容: 在本章中,您将了解以下内容:
...@@ -459,16 +459,16 @@ LSTM 是 RNN 的一种变体,可以解决梯度消失的问题。 LSTM 会在 ...@@ -459,16 +459,16 @@ LSTM 是 RNN 的一种变体,可以解决梯度消失的问题。 LSTM 会在
LSTM 单元称为内存,它们负责存储信息。 但是信息必须在存储器中保留多长时间? 我们什么时候可以删除旧信息并用新信息更新单元格? 所有这些决定将由以下三个特殊部门做出: LSTM 单元称为内存,它们负责存储信息。 但是信息必须在存储器中保留多长时间? 我们什么时候可以删除旧信息并用新信息更新单元格? 所有这些决定将由以下三个特殊部门做出:
* 忘记 * 遗忘
* 输入门 * 输入门
* 输出门 * 输出门
如果查看 LSTM 单元,则顶部水平线`C[t]`被称为单元状态。 这是信息流向的地方。 LSTM 门将不断更新有关单元状态的信息。 现在,我们将看到这些门的功能: 如果查看 LSTM 单元,则顶部水平线`C[t]`被称为单元状态。 这是信息流向的地方。 LSTM 门将不断更新有关单元状态的信息。 现在,我们将看到这些门的功能:
* **忘记门**:忘记门负责确定哪些信息不应处于单元状态。 看下面的陈述: * **遗忘门**:遗忘门负责确定哪些信息不应处于单元状态。 看下面的陈述:
“Harry 是一位好歌手。 他住在纽约。 Zayn 也是一位出色的歌手。” “Harry 是一位好歌手。 他住在纽约。 Zayn 也是一位出色的歌手。”
一旦我们开始谈论 Zayn,网络就会了解到主题已从 Harry 更改为 Zayn,并且不再需要有关 Harry 的信息。 现在,“忘记门”将从单元状态中删除/忘记关于哈利的信息。 一旦我们开始谈论 Zayn,网络就会了解到主题已从 Harry 更改为 Zayn,并且不再需要有关 Harry 的信息。 现在,“遗忘门”将从单元状态中删除/忘记关于哈利的信息。
* **输入门**:输入门负责确定应在存储器中存储哪些信息。 让我们考虑相同的示例: * **输入门**:输入门负责确定应在存储器中存储哪些信息。 让我们考虑相同的示例:
...@@ -803,7 +803,7 @@ CNN 通常包含三个主要层: ...@@ -803,7 +803,7 @@ CNN 通常包含三个主要层:
# 全连接层 # 全连接层
我们可以有多个卷积层,然后是池化层。 但是,这些图层只会从输入图像中提取特征并生成激活图。 我们如何仅凭激活图对图像中是否有一条狗进行分类? 我们必须引入一个称为完全连接层的新层。 当激活图(现在基本上是图像的特征)应用激活功能时,它将接收输入,并产生输出。 完全连接的层实际上是正常的神经网络,其中我们具有输入层,隐藏层和输出层。 在这里,我们使用卷积和池化层代替输入层,它们一起产生激活图作为输入。 我们可以有多个卷积层,然后是池化层。 但是,这些图层只会从输入图像中提取特征并生成激活图。 我们如何仅凭激活图对图像中是否有一条狗进行分类? 我们必须引入一个称为全连接层的新层。 当激活图(现在基本上是图像的特征)应用激活功能时,它将接收输入,并产生输出。 全连接层实际上是正常的神经网络,其中我们具有输入层,隐藏层和输出层。 在这里,我们使用卷积和池化层代替输入层,它们一起产生激活图作为输入。
# CNN 架构 # CNN 架构
...@@ -943,7 +943,7 @@ def maxpool2d(x): ...@@ -943,7 +943,7 @@ def maxpool2d(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
``` ```
接下来,我们定义权重和偏差。 我们将构建一个具有两个卷积层,然后是一个完全连接的层和一个输出层的卷积网络,因此我们将定义所有这些层的权重。 权重实际上是卷积层中的过滤器。 接下来,我们定义权重和偏差。 我们将构建一个具有两个卷积层,然后是一个全连接层和一个输出层的卷积网络,因此我们将定义所有这些层的权重。 权重实际上是卷积层中的过滤器。
因此,权重矩阵将初始化为`[filter_shape[0],filter_shape[1], number_of_input_channel, filter_size]` 因此,权重矩阵将初始化为`[filter_shape[0],filter_shape[1], number_of_input_channel, filter_size]`
...@@ -980,7 +980,7 @@ conv2 = tf.nn.relu(conv2d(conv1, w_c2) + b_c2) ...@@ -980,7 +980,7 @@ conv2 = tf.nn.relu(conv2d(conv1, w_c2) + b_c2)
conv2 = maxpool2d(conv2) conv2 = maxpool2d(conv2)
``` ```
经过两个带卷积和池化操作的卷积层后,我们的输入图像将从`28 * 28 * 1`降采样为`7 * 7 * 1`。 我们需要先平整该输出,然后再将其馈送到完全连接的层。 然后,第二个卷积层的结果将被馈送到完全连接的层中,我们将其与权重相乘,添加偏差并应用 ReLU 激活: 经过两个带卷积和池化操作的卷积层后,我们的输入图像将从`28 * 28 * 1`降采样为`7 * 7 * 1`。 我们需要先平整该输出,然后再将其馈送到全连接层。 然后,第二个卷积层的结果将被馈送到全连接层中,我们将其与权重相乘,添加偏差并应用 ReLU 激活:
```py ```py
x_flattened = tf.reshape(conv2, [-1, 7`7`64]) x_flattened = tf.reshape(conv2, [-1, 7`7`64])
...@@ -996,7 +996,7 @@ w_out = tf.Variable(tf.random_normal([1024, 10])) ...@@ -996,7 +996,7 @@ w_out = tf.Variable(tf.random_normal([1024, 10]))
b_out = tf.Variable(tf.random_normal([10])) b_out = tf.Variable(tf.random_normal([10]))
``` ```
我们可以通过将完全连接的层的结果与权重矩阵相乘并加上偏差来获得输出。 我们将使用`softmax`激活函数来获得输出的概率: 我们可以通过将全连接层的结果与权重矩阵相乘并加上偏差来获得输出。 我们将使用`softmax`激活函数来获得输出的概率:
```py ```py
output = tf.matmul(fc, w_out)+ b_out output = tf.matmul(fc, w_out)+ b_out
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
# 卷积网络 # 卷积网络
DQN 的第一层是卷积网络,网络的输入将是游戏屏幕的原始帧。 因此,我们采用原始框架并将其传递给卷积层以了解游戏状态。 但是原始帧将具有 210 x 160 像素和 128 个调色板,并且如果我们直接输入原始像素,显然将需要大量的计算和内存。 因此,我们将像素下采样为 84 x 84,并将 RGB 值转换为灰度值,然后将经过预处理的游戏屏幕作为卷积层的输入。 卷积层通过识别图像中不同对象之间的空间关系来理解游戏屏幕。 我们使用两个卷积层,然后使用具有 ReLU 作为激活函数的全连接层。 在这里,我们不使用池化层。 DQN 的第一层是卷积网络,网络的输入将是游戏屏幕的原始帧。 因此,我们采用原始框架并将其传递给卷积层以了解游戏状态。 但是原始帧将具有 210 x 160 像素和 128 个调色板,并且如果我们直接输入原始像素,显然将需要大量的计算和内存。 因此,我们将像素下采样为 84 x 84,并将 RGB 值转换为灰度值,然后将经过预处理的游戏屏幕作为卷积层的输入。 卷积层通过识别图像中不同对象之间的空间关系来理解游戏屏幕。 我们使用两个卷积层,然后使用具有 ReLU 作为激活函数的全连接层。 在这里,我们不使用池化层。
当执行诸如对象检测或分类之类的任务时,池层非常有用,其中我们不考虑对象在图像中的位置,而只想知道所需对象是否在图像中。 例如,如果我们要对图像中是否有狗进行分类,我们只查看图像中是否有狗,而不检查狗在哪里。 在那种情况下,使用池化层对图像进行分类,而与狗的位置无关。 但是对于我们来说,要了解游戏屏幕,位置很重要,因为它描述了游戏状态。 例如,在 Pong 游戏中,我们不仅要分类游戏屏幕上是否有球。 我们想知道球的位置,以便我们下一步行动。 这就是为什么我们在体系结构中不使用池化层的原因。 当执行诸如对象检测或分类之类的任务时,池层非常有用,其中我们不考虑对象在图像中的位置,而只想知道所需对象是否在图像中。 例如,如果我们要对图像中是否有狗进行分类,我们只查看图像中是否有狗,而不检查狗在哪里。 在那种情况下,使用池化层对图像进行分类,而与狗的位置无关。 但是对于我们来说,要了解游戏屏幕,位置很重要,因为它描述了游戏状态。 例如,在 Pong 游戏中,我们不仅要分类游戏屏幕上是否有球。 我们想知道球的位置,以便我们下一步行动。 这就是为什么我们在体系结构中不使用池化层的原因。
...@@ -143,7 +143,7 @@ def preprocess_observation(obs): ...@@ -143,7 +143,7 @@ def preprocess_observation(obs):
好的,现在我们定义一个`q_network`函数来构建我们的 Q 网络。 Q 网络的输入将是游戏状态`X` 好的,现在我们定义一个`q_network`函数来构建我们的 Q 网络。 Q 网络的输入将是游戏状态`X`
我们构建一个 Q 网络,该网络包含三个具有相同填充的卷积层,然后是一个完全连接的层: 我们构建一个 Q 网络,该网络包含三个具有相同填充的卷积层,然后是一个全连接层:
```py ```py
tf.reset_default_graph() tf.reset_default_graph()
...@@ -438,7 +438,7 @@ with tf.Session() as sess: ...@@ -438,7 +438,7 @@ with tf.Session() as sess:
![](img/00286.gif) ![](img/00286.gif)
决斗 DQN 的体系结构与 DQN 基本上相同,只是在末端的全连接层分为两个流。 一个流计算值函数,而另一个流计算优势函数。 最后,我们使用聚合层组合这两个流,并获得 Q 函数。 决斗 DQN 的体系结构与 DQN 基本上相同,只是在末端的全连接层分为两个流。 一个流计算值函数,而另一个流计算优势函数。 最后,我们使用聚合层组合这两个流,并获得 Q 函数。
为什么我们必须将我们的 Q 函数计算分成两个流? 在许多州,计算所有动作的价值估算并不重要,尤其是当我们在一个状态中有较大的动作空间时; 那么大多数动作将不会对状态产生任何影响。 同样,可能会有许多具有冗余效果的动作。 在这些情况下,与现有 DQN 体系结构相比,决斗 DQN 可以更精确地估算 Q 值: 为什么我们必须将我们的 Q 函数计算分成两个流? 在许多州,计算所有动作的价值估算并不重要,尤其是当我们在一个状态中有较大的动作空间时; 那么大多数动作将不会对状态产生任何影响。 同样,可能会有许多具有冗余效果的动作。 在这些情况下,与现有 DQN 体系结构相比,决斗 DQN 可以更精确地估算 Q 值:
......
# 用深度循环 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 体系结构的注意力机制。
在本章中,您将学习以下主题: 在本章中,您将学习以下主题:
...@@ -24,11 +24,11 @@ ...@@ -24,11 +24,11 @@
# DRQN 的体系结构 # DRQN 的体系结构
接下来显示 DRQN 的体系结构。 它类似于 DQN,但是我们用 LSTM RNN 替换了第一卷积后全连接层,如下所示: 接下来显示 DRQN 的体系结构。 它类似于 DQN,但是我们用 LSTM RNN 替换了第一卷积后全连接层,如下所示:
![](img/00288.gif) ![](img/00288.gif)
因此,我们将游戏屏幕作为卷积层的输入。 卷积层对图像进行卷积并生成特征图。 然后将生成的特征图传递到 LSTM 层。 LSTM 层具有用于保存信息的内存。 LSTM 层保留有关重要的先前游戏状态的信息,并根据需要随时间步长更新其内存。 穿过完全连接的层后,它将输出`Q`值。 因此,与 DQN 不同,我们不直接估计`Q(s[t], a[t])`。 相反,我们估算`Q(h[t], a[t])`,其中`h[t]`是网络在上一个时间步长返回的输入。 即,`h[t] = LSTM(h[t-1], o[t])`。 当我们使用 RNN 时,我们通过时间的反向传播来训练我们的网络。 因此,我们将游戏屏幕作为卷积层的输入。 卷积层对图像进行卷积并生成特征图。 然后将生成的特征图传递到 LSTM 层。 LSTM 层具有用于保存信息的内存。 LSTM 层保留有关重要的先前游戏状态的信息,并根据需要随时间步长更新其内存。 穿过全连接层后,它将输出`Q`值。 因此,与 DQN 不同,我们不直接估计`Q(s[t], a[t])`。 相反,我们估算`Q(h[t], a[t])`,其中`h[t]`是网络在上一个时间步长返回的输入。 即,`h[t] = LSTM(h[t-1], o[t])`。 当我们使用 RNN 时,我们通过时间的反向传播来训练我们的网络。
等待。 体验重播缓冲区如何? 在 DQN 中,为避免相关的体验,我们使用了体验重播,该体验存储了游戏的过渡,并使用了随机的一组体验来训练网络。 对于 DRQN,我们将整个情节存储在体验缓冲区中,并从随机的情节批次中随机采样`n`个步骤。 因此,通过这种方式,我们既可以适应随机化,又可以适应另一种实际的体验。 等待。 体验重播缓冲区如何? 在 DQN 中,为避免相关的体验,我们使用了体验重播,该体验存储了游戏的过渡,并使用了随机的一组体验来训练网络。 对于 DRQN,我们将整个情节存储在体验缓冲区中,并从随机的情节批次中随机采样`n`个步骤。 因此,通过这种方式,我们既可以适应随机化,又可以适应另一种实际的体验。
......
# Capstone 项目–使用 DQN 进行赛车 # 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 来赢得赛车比赛的代理商。
在本章中,您将学习如何实现以下内容: 在本章中,您将学习如何实现以下内容:
...@@ -153,7 +153,7 @@ class EnvWrapper: ...@@ -153,7 +153,7 @@ class EnvWrapper:
# 决斗网络 # 决斗网络
现在,我们构建对决 DQN; 我们先构建三个卷积层,然后是两个完全连接的层,最后一个完全连接的层将被分为两个单独的层,用于价值流和优势流。 我们将使用将值流和优势流结合在一起的聚合层来计算 q 值。 这些层的尺寸如下: 现在,我们构建对决 DQN; 我们先构建三个卷积层,然后是两个全连接层,最后一个全连接层将被分为两个单独的层,用于价值流和优势流。 我们将使用将值流和优势流结合在一起的聚合层来计算 q 值。 这些层的尺寸如下:
* **第 1 层**:32 个 8x8 滤镜,步幅为 4 + RELU * **第 1 层**:32 个 8x8 滤镜,步幅为 4 + RELU
* **第 2 层**:64 个 4x4 滤镜,步幅为 2 + RELU * **第 2 层**:64 个 4x4 滤镜,步幅为 2 + RELU
...@@ -736,7 +736,7 @@ env.monitor.close() ...@@ -736,7 +736,7 @@ env.monitor.close()
# 概要 # 概要
在本章中,我们学习了如何详细实现对决 DQN。 我们从用于游戏画面预处理的基本环境包装器功能开始,然后定义了`QNetworkDueling`类。 在这里,我们实现了决斗 Q 网络,该网络将 DQN 的最终全连接层分为值流和优势流,然后将这两个流组合以计算`q`值。 之后,我们看到了如何创建重播缓冲区,该缓冲区用于存储经验并为网络训练提供经验的小批量样本,最后,我们使用 OpenAI 的 Gym 初始化了赛车环境并训练了我们的代理。 在下一章第 13 章,“最新进展和后续步骤”中,我们将看到 RL 的一些最新进展。 在本章中,我们学习了如何详细实现对决 DQN。 我们从用于游戏画面预处理的基本环境包装器功能开始,然后定义了`QNetworkDueling`类。 在这里,我们实现了决斗 Q 网络,该网络将 DQN 的最终全连接层分为值流和优势流,然后将这两个流组合以计算`q`值。 之后,我们看到了如何创建重播缓冲区,该缓冲区用于存储经验并为网络训练提供经验的小批量样本,最后,我们使用 OpenAI 的 Gym 初始化了赛车环境并训练了我们的代理。 在下一章第 13 章,“最新进展和后续步骤”中,我们将看到 RL 的一些最新进展。
# 问题 # 问题
......
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
# 第九章 # 第九章
1. DRQN 利用**递归神经网络****RNN**),其中 DQN 利用香草神经网络。 1. DRQN 利用**循环神经网络****RNN**),其中 DQN 利用香草神经网络。
2. 当可以部分观察 MDP 时,不使用 DQN。 2. 当可以部分观察 MDP 时,不使用 DQN。
3. 请参阅“DRQN 的厄运”部分。 3. 请参阅“DRQN 的厄运”部分。
4. 与 DRQN 不同,DARQN 利用注意力机制。 4. 与 DRQN 不同,DARQN 利用注意力机制。
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
第 2 章,“迁移学习”涵盖了如何使用迁移学习来检测人眼中糖尿病性视网膜病变的情况以及确定视网膜病变的严重程度。 我们将探索 CNN,并学习如何使用能够在人眼眼底图像中检测出糖尿病性视网膜病变的 CNN 训练模型。 第 2 章,“迁移学习”涵盖了如何使用迁移学习来检测人眼中糖尿病性视网膜病变的情况以及确定视网膜病变的严重程度。 我们将探索 CNN,并学习如何使用能够在人眼眼底图像中检测出糖尿病性视网膜病变的 CNN 训练模型。
第 3 章,“神经机器翻译”涵盖了**递归神经网络****RNN**)体系结构的基础。 我们还将学习三种不同的机器翻译系统:基于规则的机器翻译,统计机器翻译和神经机器翻译。 第 3 章,“神经机器翻译”涵盖了**循环神经网络****RNN**)体系结构的基础。 我们还将学习三种不同的机器翻译系统:基于规则的机器翻译,统计机器翻译和神经机器翻译。
第 4 章,“在 GAN 中使用 GAN” 进行时尚行业中的样式迁移,说明如何创建智能 AI 模型以生成具有与给定手袋相似样式的鞋子,反之亦然。 我们将使用 Vanilla GAN 通过 GAN 的定制版本(例如 DiscoGAN 和 CycleGAN)来实施项目。 第 4 章,“在 GAN 中使用 GAN” 进行时尚行业中的样式迁移,说明如何创建智能 AI 模型以生成具有与给定手袋相似样式的鞋子,反之亦然。 我们将使用 Vanilla GAN 通过 GAN 的定制版本(例如 DiscoGAN 和 CycleGAN)来实施项目。
......
...@@ -266,15 +266,15 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢 ...@@ -266,15 +266,15 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢
要注意的一件事是,卷积运算减少了每层要学习的权重数。 例如,如果我们有一个空间尺寸为 224 x 224 的输入图像,而下一层的期望输出为尺寸为 224 x 224 的尺寸,那么对于具有完整连接的传统神经网络来说,要学习的权重数 是 224 x 224 x 224 x 224.对于具有相同输入和输出尺寸的卷积层,我们需要学习的只是滤波器内核的权重。 因此,如果我们使用 3 x 3 过滤器内核,我们只需要学习 9 个权重即可,而不是 224 x 224 x 224 x 224 权重。 这种简化是有效的,因为局部空间邻域中的图像和音频之类的结构之间具有高度相关性。 要注意的一件事是,卷积运算减少了每层要学习的权重数。 例如,如果我们有一个空间尺寸为 224 x 224 的输入图像,而下一层的期望输出为尺寸为 224 x 224 的尺寸,那么对于具有完整连接的传统神经网络来说,要学习的权重数 是 224 x 224 x 224 x 224.对于具有相同输入和输出尺寸的卷积层,我们需要学习的只是滤波器内核的权重。 因此,如果我们使用 3 x 3 过滤器内核,我们只需要学习 9 个权重即可,而不是 224 x 224 x 224 x 224 权重。 这种简化是有效的,因为局部空间邻域中的图像和音频之类的结构之间具有高度相关性。
输入图像经过多层卷积和池化操作。 随着网络的发展,特征图的数量增加,而图像的空间分辨率降低。 在卷积池层的末端,要素图的输出被馈送到完全连接的层,然后是输出层。 输入图像经过多层卷积和池化操作。 随着网络的发展,特征图的数量增加,而图像的空间分辨率降低。 在卷积池层的末端,要素图的输出被馈送到全连接层,然后是输出层。
输出单位取决于手头的任务。 如果执行回归,则输出激活单位是线性的,而如果是二进制分类问题,则输出单位是 S 形的。 对于多类别分类,输出层是 softmax 单位。 输出单位取决于手头的任务。 如果执行回归,则输出激活单位是线性的,而如果是二进制分类问题,则输出单位是 S 形的。 对于多类别分类,输出层是 softmax 单位。
在本书的所有图像处理项目中,我们都将使用一种或另一种形式的卷积神经网络。 在本书的所有图像处理项目中,我们都将使用一种或另一种形式的卷积神经网络。
# 递归神经网络(RNN) # 循环神经网络(RNN)
**递归神经网络****RNN**)在处理顺序或时间数据时非常有用,其中给定实例或位置的数据与先前时间步长或位置中的数据高度相关。 RNN 在处理文本数据方面已经非常成功,因为给定实例中的单词与它前面的单词高度相关。 在 RNN 中,网络在每个时间步执行相同的功能,因此名称中的术语**重复出现**。 下图说明了 RNN 的体系结构: **循环神经网络****RNN**)在处理顺序或时间数据时非常有用,其中给定实例或位置的数据与先前时间步长或位置中的数据高度相关。 RNN 在处理文本数据方面已经非常成功,因为给定实例中的单词与它前面的单词高度相关。 在 RNN 中,网络在每个时间步执行相同的功能,因此名称中的术语**重复出现**。 下图说明了 RNN 的体系结构:
![](img/0c426b93-140c-48a7-b982-e649cbaac4e3.png) ![](img/0c426b93-140c-48a7-b982-e649cbaac4e3.png)
...@@ -318,7 +318,7 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢 ...@@ -318,7 +318,7 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢
图 1.13:LSTM 架构 图 1.13:LSTM 架构
除了记忆状态`h[t]`之外,LSTM 还介绍了 RNN 单元状态`C[t]`。 单元状态由三个门控制:忘记门,更新门和输出门。 忘记门确定从先前的单元状态`C[t-1]`保留多少信息,其输出表示如下: 除了记忆状态`h[t]`之外,LSTM 还介绍了 RNN 单元状态`C[t]`。 单元状态由三个门控制:遗忘门,更新门和输出门。 遗忘门确定从先前的单元状态`C[t-1]`保留多少信息,其输出表示如下:
![](img/00985346-4740-4212-97ff-0506b23e7d21.png) ![](img/00985346-4740-4212-97ff-0506b23e7d21.png)
...@@ -480,7 +480,7 @@ Figure 1.14: GAN architecture  ...@@ -480,7 +480,7 @@ Figure 1.14: GAN architecture 
由于不同层之间的连接模式的性质,深度学习模型倾向于具有大量参数。 要训​​练这么大的模型,需要大量的数据; 否则,模型可能会过度拟合。 对于许多需要深度学习解决方案的问题,将无法获得大量数据。 例如,在用于对象识别的图像处理中,深度学习模型提供了最新的解决方案。 在这种情况下,可以基于从现有的经过训练的深度学习模型中学习到的特征检测器,使用迁移学习来创建特征。 然后,这些功能可用于使用可用数据构建简单模型,以解决当前的新问题。 因此,新模型需要学习的唯一参数是与构建简单模型有关的参数,从而减少了过拟合的机会。 通常在大量数据上训练预训练的模型,因此,它们具有作为特征检测器的可靠参数。 由于不同层之间的连接模式的性质,深度学习模型倾向于具有大量参数。 要训​​练这么大的模型,需要大量的数据; 否则,模型可能会过度拟合。 对于许多需要深度学习解决方案的问题,将无法获得大量数据。 例如,在用于对象识别的图像处理中,深度学习模型提供了最新的解决方案。 在这种情况下,可以基于从现有的经过训练的深度学习模型中学习到的特征检测器,使用迁移学习来创建特征。 然后,这些功能可用于使用可用数据构建简单模型,以解决当前的新问题。 因此,新模型需要学习的唯一参数是与构建简单模型有关的参数,从而减少了过拟合的机会。 通常在大量数据上训练预训练的模型,因此,它们具有作为特征检测器的可靠参数。
当我们在 CNN 中处理图像时,初始层会学会检测非常通用的特征,例如卷曲,边缘,颜色组成等。 随着网络的深入发展,更深层次的卷积层将学会检测与特定种类的数据集相关的更复杂特征。 我们可以使用预训练的网络,并选择不训练前几层,因为它们会学习非常通用的功能。 相反,我们可以只专注于训练最后几层的参数,因为它们将学习针对当前问题的复杂功能。 这样可以确保我们需要训练的参数较少,并且可以明智地使用数据,仅训练所需的复杂参数,而不训练通用特征。 当我们在 CNN 中处理图像时,初始层会学会检测非常通用的特征,例如卷曲,边缘,颜色组成等。 随着网络的深入发展,更深层次的卷积层将学会检测与特定种类的数据集相关的更复杂特征。 我们可以使用预训练的网络,并选择不训练前几层,因为它们会学习非常通用的功能。 相反,我们可以只专注于训练最后几层的参数,因为它们将学习针对当前问题的复杂功能。 这样可以确保我们需要训练的参数较少,并且可以明智地使用数据,仅训练所需的复杂参数,而不训练通用特征。
迁移学习已广泛应用于通过 CNN 进行图像处理的过程,其中滤镜充当特征检测器。 用于迁移学习的最常见的预训练 CNN 是`AlexNet``VGG16``VGG19``Inception V3``ResNet`等。 下图说明了用于传输学习的预训练`VGG16`网络: 迁移学习已广泛应用于通过 CNN 进行图像处理的过程,其中滤镜充当特征检测器。 用于迁移学习的最常见的预训练 CNN 是`AlexNet``VGG16``VGG19``Inception V3``ResNet`等。 下图说明了用于传输学习的预训练`VGG16`网络:
...@@ -488,7 +488,7 @@ Figure 1.14: GAN architecture  ...@@ -488,7 +488,7 @@ Figure 1.14: GAN architecture 
图 1.18:使用预训练的 VGG 16 网络进行迁移学习 图 1.18:使用预训练的 VGG 16 网络进行迁移学习
`x`表示的输入图像被馈送到**预训练的 VGG 16** 网络,以及`4096`维输出特征向量 **x'***是从最后一个完全连接的层中提取的。 提取的特征 **x'**以及相应的类别标签`y`用于训练简单的分类网络,从而减少解决问题所需的数据。* `x`表示的输入图像被馈送到**预训练的 VGG 16** 网络,以及`4096`维输出特征向量 **x'***是从最后一个全连接层中提取的。 提取的特征 **x'**以及相应的类别标签`y`用于训练简单的分类网络,从而减少解决问题所需的数据。*
我们将通过使用第 2 章,“迁移学习”中的迁移学习来解决医疗保健领域中的图像分类问题。 我们将通过使用第 2 章,“迁移学习”中的迁移学习来解决医疗保健领域中的图像分类问题。
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
* 人工神经网络的成本面是非凸的; 因此,它需要一组良好的初始权重才能实现合理的收敛。 * 人工神经网络的成本面是非凸的; 因此,它需要一组良好的初始权重才能实现合理的收敛。
* 人工神经网络具有很多参数,因此,它们需要大量数据进行训练。 不幸的是,对于许多项目而言,可用于训练神经网络的特定数据不足,而该项目旨在解决的问题非常复杂,需要神经网络解决方案。 * 人工神经网络具有很多参数,因此,它们需要大量数据进行训练。 不幸的是,对于许多项目而言,可用于训练神经网络的特定数据不足,而该项目旨在解决的问题非常复杂,需要神经网络解决方案。
在这两种情况下,迁移学习都可以解决。 如果我们使用在大量标记数据上训练的预训练模型,例如 ImageNet 或 CIFAR,则涉及迁移学习的问题将具有很好的初始权重来开始训练; 然后可以根据现有数据对这些权重进行微调。 同样,为了避免在较少的数据量上训练复杂的模型,我们可能希望从预先训练的神经网络中提取复杂的特征,然后使用这些特征来训练相对简单的模型,例如 SVM 或逻辑模型 回归模型。 举个例子,如果我们正在研究图像分类问题,并且已经有一个预先训练的模型(例如,基于 1,000 个 ImageNet 的`VGG16`网络),我们可以通过`VGG16`的权重传递训练数据 并从最后一个池化层提取特征。 如果我们有`m`个训练数据点,则可以使用等式![](img/139dc334-8e37-42cb-a0b1-1b0365f4800f.png),其中`x`是特征向量,`y`是输出类。 然后,我们可以从预先训练的`VGG16`网络中得出复杂的特征,例如向量`h`,如下所示: 在这两种情况下,迁移学习都可以解决。 如果我们使用在大量标记数据上训练的预训练模型,例如 ImageNet 或 CIFAR,则涉及迁移学习的问题将具有很好的初始权重来开始训练; 然后可以根据现有数据对这些权重进行微调。 同样,为了避免在较少的数据量上训练复杂的模型,我们可能希望从预训练的神经网络中提取复杂的特征,然后使用这些特征来训练相对简单的模型,例如 SVM 或逻辑模型 回归模型。 举个例子,如果我们正在研究图像分类问题,并且已经有一个预训练的模型(例如,基于 1,000 个 ImageNet 的`VGG16`网络),我们可以通过`VGG16`的权重传递训练数据 并从最后一个池化层提取特征。 如果我们有`m`个训练数据点,则可以使用等式![](img/139dc334-8e37-42cb-a0b1-1b0365f4800f.png),其中`x`是特征向量,`y`是输出类。 然后,我们可以从预训练的`VGG16`网络中得出复杂的特征,例如向量`h`,如下所示:
![](img/bb55e155-7677-4ae6-8bf9-9998e72422ab.png) ![](img/bb55e155-7677-4ae6-8bf9-9998e72422ab.png)
...@@ -303,13 +303,13 @@ Inception V1(GoogleNet)是 2014 年 ILSVRC 竞赛的获胜者。 它的最 ...@@ -303,13 +303,13 @@ Inception V1(GoogleNet)是 2014 年 ILSVRC 竞赛的获胜者。 它的最
# VGG16 迁移学习网络 # VGG16 迁移学习网络
我们将从预先训练的`VGG16`网络中的最后一个合并层中获取输出,并添加一对完全连接的层,每个层 512 个单元,然后是输出层。 最终池化层的输出是从全局平均池化操作传递到完全连接层之前的。 我们只可以展平池化层的输出,而不是执行全局平均池化-其思想是确保池化的输出不是二维晶格格式,而是一维数组格式, 非常像一个完全连接的层。 下图说明了基于预训练的`VGG16`的新`VGG16`***,*** 的体系结构: 我们将从预训练的`VGG16`网络中的最后一个合并层中获取输出,并添加一对全连接层,每个层 512 个单元,然后是输出层。 最终池化层的输出是从全局平均池化操作传递到全连接层之前的。 我们只可以展平池化层的输出,而不是执行全局平均池化-其思想是确保池化的输出不是二维晶格格式,而是一维数组格式, 非常像一个全连接层。 下图说明了基于预训练的`VGG16`的新`VGG16`***,*** 的体系结构:
![](img/c2ef9608-eaff-46fd-990c-75a189d2463b.png) ![](img/c2ef9608-eaff-46fd-990c-75a189d2463b.png)
图 2.10:VGG16 迁移学习网络 图 2.10:VGG16 迁移学习网络
如上图所示,我们将从预训练网络中的最后一个最大池化层提取输出,并在最终输出层之前附加两个完全连接的层。 基于先前的架构,可以使用`keras`如下代码块所示定义 VGG 定义函数: 如上图所示,我们将从预训练网络中的最后一个最大池化层提取输出,并在最终输出层之前附加两个全连接层。 基于先前的架构,可以使用`keras`如下代码块所示定义 VGG 定义函数:
```py ```py
def VGG16_pseudo(dim=224,freeze_layers=10,full_freeze='N'): def VGG16_pseudo(dim=224,freeze_layers=10,full_freeze='N'):
...@@ -335,7 +335,7 @@ def VGG16_pseudo(dim=224,freeze_layers=10,full_freeze='N'): ...@@ -335,7 +335,7 @@ def VGG16_pseudo(dim=224,freeze_layers=10,full_freeze='N'):
在以下代码块中定义了用于我们任务的`InceptionV3`网络。 需要注意的一件事是,由于`InceptionV3`是一个更深的网络,因此我们可以拥有更多的初始层。 在数据可用性方面,不训练每个模型中的所有层的想法还有另一个优势。 如果我们使用较少的数据训练,则整个网络的权重可能会导致过度拟合。 冻结层会减少要训练的权重数,因此提供了一种形式的规则化。 在以下代码块中定义了用于我们任务的`InceptionV3`网络。 需要注意的一件事是,由于`InceptionV3`是一个更深的网络,因此我们可以拥有更多的初始层。 在数据可用性方面,不训练每个模型中的所有层的想法还有另一个优势。 如果我们使用较少的数据训练,则整个网络的权重可能会导致过度拟合。 冻结层会减少要训练的权重数,因此提供了一种形式的规则化。
由于初始层学习通用特征,而与问题的范围无关,因此它们是冻结的最佳层。 我们还在完全连接的层中使用了 dropout,以防止过度拟合: 由于初始层学习通用特征,而与问题的范围无关,因此它们是冻结的最佳层。 我们还在全连接层中使用了 dropout,以防止过度拟合:
```py ```py
def inception_pseudo(dim=224,freeze_layers=30,full_freeze='N'): def inception_pseudo(dim=224,freeze_layers=30,full_freeze='N'):
...@@ -379,7 +379,7 @@ def resnet_pseudo(dim=224,freeze_layers=10,full_freeze='N'): ...@@ -379,7 +379,7 @@ def resnet_pseudo(dim=224,freeze_layers=10,full_freeze='N'):
# 优化器和初始学习率 # 优化器和初始学习率
**Adam** 优化器(**自适应矩估计器**)用于实现随机梯度下降高级版本的训练。 Adam 优化器会考虑成本函数中的曲率,同时使用动量来确保朝着良好的局部最小值稳定发展。 对于眼前的问题,由于我们正在使用迁移学习,并且希望使用从预训练的网络中获得的尽可能多的先前学习的功能,因此我们将使用较小的初始学习率`0.00001`。 这将确保网络不会丢失经过预训练的网络学习到的有用功能,并根据当前问题的新数据将其微调至较不激进的最佳点。 Adam 优化器可以定义如下: **Adam** 优化器(**自适应矩估计器**)用于实现随机梯度下降高级版本的训练。 Adam 优化器会考虑成本函数中的曲率,同时使用动量来确保朝着良好的局部最小值稳定发展。 对于眼前的问题,由于我们正在使用迁移学习,并且希望使用从预训练的网络中获得的尽可能多的先前学习的功能,因此我们将使用较小的初始学习率`0.00001`。 这将确保网络不会丢失经过预训练的网络学习到的有用功能,并根据当前问题的新数据将其微调至较不激进的最佳点。 Adam 优化器可以定义如下:
```py ```py
adam = optimizers.Adam(lr=0.00001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0) adam = optimizers.Adam(lr=0.00001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* 从源语言到目标语言的词到词映射并非始终可用。 * 从源语言到目标语言的词到词映射并非始终可用。
* 即使在源语言和目标语言之间确实存在精确的词对词映射,这些语言的句法结构通常也不相互对应。 机器翻译中的此问题通常称为*对齐错误* * 即使在源语言和目标语言之间确实存在精确的词对词映射,这些语言的句法结构通常也不相互对应。 机器翻译中的此问题通常称为*对齐错误*
但是,随着**递归神经网络****RNN**)体系结构的最新进展,机器翻译不仅提供了更高的翻译质量,而且还提供了更高的翻译质量 这种系统的复杂性远远小于传统系统。 但是,随着**循环神经网络****RNN**)体系结构的最新进展,机器翻译不仅提供了更高的翻译质量,而且还提供了更高的翻译质量 这种系统的复杂性远远小于传统系统。
机器翻译系统大致可分为三类:基于规则的机器翻译,统计机器翻译和神经机器翻译。 机器翻译系统大致可分为三类:基于规则的机器翻译,统计机器翻译和神经机器翻译。
...@@ -964,4 +964,4 @@ Decoded sentence: Où fut ? ...@@ -964,4 +964,4 @@ Decoded sentence: Où fut ?
读者现在应该对几种机器翻译方法以及神经翻译机器与传统机器有何不同有很好的理解。 现在,我们还应该深入了解如何从头开始构建神经机器翻译系统,以及如何以有趣的方式扩展该系统。 借助提供的信息和实现演示,建议读者探索其他并行语料库数据集。 读者现在应该对几种机器翻译方法以及神经翻译机器与传统机器有何不同有很好的理解。 现在,我们还应该深入了解如何从头开始构建神经机器翻译系统,以及如何以有趣的方式扩展该系统。 借助提供的信息和实现演示,建议读者探索其他并行语料库数据集。
在本章中,我们定义了嵌入层,但未使用预先训练的嵌入(例如 GloVe,FastText 等)来加载它们。 建议读者使用预训练的词向量嵌入为嵌入层加载,并查看是否会产生更好的结果。 在第 4 章中,“使用 GAN 进行时装行业中的样式迁移”,我们将通过与生成性对抗网络(这是现代的革命)进行与时装业中样式迁移有关的项目。 人工智能领域。 在本章中,我们定义了嵌入层,但未使用预训练的嵌入(例如 GloVe,FastText 等)来加载它们。 建议读者使用预训练的词向量嵌入为嵌入层加载,并查看是否会产生更好的结果。 在第 4 章中,“使用 GAN 进行时装行业中的样式迁移”,我们将通过与生成性对抗网络(这是现代的革命)进行与时装业中样式迁移有关的项目。 人工智能领域。
\ No newline at end of file \ No newline at end of file
...@@ -300,7 +300,7 @@ def build_generator(self,image,reuse=False,name='generator'): ...@@ -300,7 +300,7 @@ def build_generator(self,image,reuse=False,name='generator'):
# DiscoGAN 的区别 # DiscoGAN 的区别
DiscoGAN 的区分者将学会在特定域中将真实图像与假图像区分开。 我们将有两个鉴别符:一个用于域 A,一个用于域 B。这些鉴别器也是可以执行二进制分类的卷积网络。 与传统的基于分类的卷积网络不同,鉴别器没有任何完全连接的层。 使用步长为 2 的卷积对输入图像进行下采样,直到最终层(输出为 1 x 1)为止。同样,我们使用泄漏的 ReLU 作为激活函数并使用批处理归一化以实现稳定和快速的收敛。 以下代码显示了 TensorFlow 中鉴别器构建函数的实现: DiscoGAN 的区分者将学会在特定域中将真实图像与假图像区分开。 我们将有两个鉴别符:一个用于域 A,一个用于域 B。这些鉴别器也是可以执行二进制分类的卷积网络。 与传统的基于分类的卷积网络不同,鉴别器没有任何全连接层。 使用步长为 2 的卷积对输入图像进行下采样,直到最终层(输出为 1 x 1)为止。同样,我们使用泄漏的 ReLU 作为激活函数并使用批处理归一化以实现稳定和快速的收敛。 以下代码显示了 TensorFlow 中鉴别器构建函数的实现:
```py ```py
def build_discriminator(self,image,reuse=False,name='discriminator'): def build_discriminator(self,image,reuse=False,name='discriminator'):
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
随着视频制作速度成倍增长,视频已成为一种重要的沟通媒介。 但是,由于缺乏适当的字幕,视频仍无法吸引更多的观众。 随着视频制作速度成倍增长,视频已成为一种重要的沟通媒介。 但是,由于缺乏适当的字幕,视频仍无法吸引更多的观众。
视频字幕(翻译视频以生成有意义的内容摘要的艺术)在计算机视觉和机器学习领域是一项具有挑战性的任务。 传统的视频字幕制作方法并没有成功。 但是,随着最近借助深度学习在人工智能方面的发展,视频字幕最近引起了极大的关注。 卷积神经网络以及递归神经网络的强大功能使得构建端到端企业级视频字幕系统成为可能。 卷积神经网络处理视频中的图像帧以提取重要特征,这些特征由递归神经网络依次处理以生成有意义的视频摘要。 视频字幕系统的一些重要应用如下: 视频字幕(翻译视频以生成有意义的内容摘要的艺术)在计算机视觉和机器学习领域是一项具有挑战性的任务。 传统的视频字幕制作方法并没有成功。 但是,随着最近借助深度学习在人工智能方面的发展,视频字幕最近引起了极大的关注。 卷积神经网络以及循环神经网络的强大功能使得构建端到端企业级视频字幕系统成为可能。 卷积神经网络处理视频中的图像帧以提取重要特征,这些特征由循环神经网络依次处理以生成有意义的视频摘要。 视频字幕系统的一些重要应用如下:
* 自动监控工厂安全措施 * 自动监控工厂安全措施
* 根据通过视频字幕获得的内容对视频进行聚类 * 根据通过视频字幕获得的内容对视频进行聚类
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
* 探索序列到序列视频字幕系统的体系结构 * 探索序列到序列视频字幕系统的体系结构
* 利用*序列到序列的体系结构*,构建视频到文本的视频字幕系统 * 利用*序列到序列的体系结构*,构建视频到文本的视频字幕系统
在下一节中,我们将介绍如何使用卷积神经网络和递归神经网络的 LSTM 版本来构建端到端视频字幕系统。 在下一节中,我们将介绍如何使用卷积神经网络和循环神经网络的 LSTM 版本来构建端到端视频字幕系统。
# 技术要求 # 技术要求
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
# 视频字幕中的 CNN 和 LSTM # 视频字幕中的 CNN 和 LSTM
视频减去音频后,可以认为是按顺序排列的图像集合。 可以使用针对特定图像分类问题训练的卷积神经网络(例如 **ImageNet**)从这些图像中提取重要特征。 预训练网络的最后一个全连接层的激活可用于从视频的顺序采样图像中得出特征。 从视频顺序采样图像的频率速率取决于视频中内容的类型,可以通过训练进行优化。 视频减去音频后,可以认为是按顺序排列的图像集合。 可以使用针对特定图像分类问题训练的卷积神经网络(例如 **ImageNet**)从这些图像中提取重要特征。 预训练网络的最后一个全连接层的激活可用于从视频的顺序采样图像中得出特征。 从视频顺序采样图像的频率速率取决于视频中内容的类型,可以通过训练进行优化。
下图(“图 5.1”)说明了用于从视频中提取特征的预训练神经网络: 下图(“图 5.1”)说明了用于从视频中提取特征的预训练神经网络:
...@@ -37,9 +37,9 @@ ...@@ -37,9 +37,9 @@
图 5.1:使用预训练的神经网络提取视频图像特征 图 5.1:使用预训练的神经网络提取视频图像特征
从上图可以看出,从视频中顺序采样的图像经过预训练的卷积神经网络,并且最后一个完全连接层中的`4,096`单元的激活为 输出。 如果将`t`时的视频图像表示为`x[t]`,并且最后一个完全连接层的输出表示为`f[t] ∈ R^4096`,然后`f[t] = f[w](x[t])`。 此处,`W`表示直到最后一个完全连接层的卷积神经网络的权重。 从上图可以看出,从视频中顺序采样的图像经过预训练的卷积神经网络,并且最后一个全连接层中的`4,096`单元的激活为 输出。 如果将`t`时的视频图像表示为`x[t]`,并且最后一个全连接层的输出表示为`f[t] ∈ R^4096`,然后`f[t] = f[w](x[t])`。 此处,`W`表示直到最后一个全连接层的卷积神经网络的权重。
这些系列的输出功能`f[1], f[2], ..., f[t], ..., f[n]`可以作为递归神经网络的输入,该神经网络学习根据输入特征生成文本标题,如下图所示(“图 5.2”]): 这些系列的输出功能`f[1], f[2], ..., f[t], ..., f[n]`可以作为循环神经网络的输入,该神经网络学习根据输入特征生成文本标题,如下图所示(“图 5.2”]):
![](img/c4301074-d0a6-499d-97fb-04b39f20d188.png) ![](img/c4301074-d0a6-499d-97fb-04b39f20d188.png)
...@@ -63,7 +63,7 @@ o1, o2, . . . . . ot . . . oN = { "A ","man" "in" "a" "yellow" "helmet" "is" "wo ...@@ -63,7 +63,7 @@ o1, o2, . . . . . ot . . . oN = { "A ","man" "in" "a" "yellow" "helmet" "is" "wo
图 5.3:序列到序列视频字幕网络架构 图 5.3:序列到序列视频字幕网络架构
序列到序列模型通过像以前一样通过预训练的卷积神经网络处理视频图像帧,最后一个完全连接层的输出激活被视为要馈送到后续 LSTM 的特征。 如果我们在时间步`t`表示预训练卷积神经网络的最后一个完全连接层的输出激活为`f[t] ∈ R^4096`,那么我们将为视频中的`N`个图像帧使用`N`个这样的特征向量。 这些`N`个特征向量`f[1], f[2], ..., f[t], ..., f[n]`依次输入 LSTM,以生成文本标题。 序列到序列模型通过像以前一样通过预训练的卷积神经网络处理视频图像帧,最后一个全连接层的输出激活被视为要馈送到后续 LSTM 的特征。 如果我们在时间步`t`表示预训练卷积神经网络的最后一个全连接层的输出激活为`f[t] ∈ R^4096`,那么我们将为视频中的`N`个图像帧使用`N`个这样的特征向量。 这些`N`个特征向量`f[1], f[2], ..., f[t], ..., f[n]`依次输入 LSTM,以生成文本标题。
背靠背有两个 LSTM,LSTM 中的序列数是来自视频的图像帧数与字幕词汇表中文本字幕的最大长度之和。 如果在视频的`N`个图像帧上训练网络,并且词汇表中的最大文本标题长度为`M`,则 LSTM 在`N + M`时间步长上训练。 在`N`个时间步中,第一个 LSTM 依次处理特征向量`f[1], f[2], ..., f[t], ..., f[n]`,并将其生成的隐藏状态馈送到第二 LSTM。 在这些`N`个时间步中,第二个 LSTM 不需要文本输出目标。 如果我们将第一个 LSTM 在时间步`t`的隐藏状态表示为`h[t]`,则第二个 LSTM 在前`N`个时间步长的输入为`h[t]`。 请注意,从`N + 1`时间步长开始,第一个 LSTM 的输入是零填充的,因此该输入对`t > N``h[t]`没有隐藏状态的影响。。 请注意,这并不保证`t > N`的隐藏状态`h[t]`总是相同的。 实际上,我们可以选择在任何时间步长`t > N`中将`h[t]`作为`h[T]`送入第二个 LSTM。 背靠背有两个 LSTM,LSTM 中的序列数是来自视频的图像帧数与字幕词汇表中文本字幕的最大长度之和。 如果在视频的`N`个图像帧上训练网络,并且词汇表中的最大文本标题长度为`M`,则 LSTM 在`N + M`时间步长上训练。 在`N`个时间步中,第一个 LSTM 依次处理特征向量`f[1], f[2], ..., f[t], ..., f[n]`,并将其生成的隐藏状态馈送到第二 LSTM。 在这些`N`个时间步中,第二个 LSTM 不需要文本输出目标。 如果我们将第一个 LSTM 在时间步`t`的隐藏状态表示为`h[t]`,则第二个 LSTM 在前`N`个时间步长的输入为`h[t]`。 请注意,从`N + 1`时间步长开始,第一个 LSTM 的输入是零填充的,因此该输入对`t > N``h[t]`没有隐藏状态的影响。。 请注意,这并不保证`t > N`的隐藏状态`h[t]`总是相同的。 实际上,我们可以选择在任何时间步长`t > N`中将`h[t]`作为`h[T]`送入第二个 LSTM。
...@@ -91,7 +91,7 @@ o1, o2, . . . . . ot . . . oN = { "A ","man" "in" "a" "yellow" "helmet" "is" "wo ...@@ -91,7 +91,7 @@ o1, o2, . . . . . ot . . . oN = { "A ","man" "in" "a" "yellow" "helmet" "is" "wo
# 处理视频图像以创建 CNN 功能 # 处理视频图像以创建 CNN 功能
从指定位置下载数据后,下一个任务是处理视频图像帧,以从预训练的卷积神经网络的最后完全连接的层中提取特征。 我们使用在 ImageNet 上预训练的`VGG16`卷积神经网络。 我们将激活从`VGG16`的最后一个完全连接的层中取出。 由于`VGG16`的最后一个完全连接的层具有`4096`单位,因此每个时间步`t`的特征向量`f[t]``4096`维向量,`f[t] ∈ R^4096` 从指定位置下载数据后,下一个任务是处理视频图像帧,以从预训练的卷积神经网络的最后全连接层中提取特征。 我们使用在 ImageNet 上预训练的`VGG16`卷积神经网络。 我们将激活从`VGG16`的最后一个全连接层中取出。 由于`VGG16`的最后一个全连接层具有`4096`单位,因此每个时间步`t`的特征向量`f[t]``4096`维向量,`f[t] ∈ R^4096`
在通过`VGG16`处理视频中的图像之前,需要从视频中对其进行采样。 我们从视频中采样图像,使每个视频具有`80`帧。 处理来自`VGG16``80`图像帧后,每个视频将具有`80`特征向量`f[1], f[2], ..., f[80]`。 这些功能将被馈送到 LSTM 以生成文本序列。 我们在 Keras 中使用了预训练的`VGG16`模型。 我们创建一个`VideoCaptioningPreProcessing`类,该类首先通过函数`video_to_frames`从每个视频中提取`80`视频帧作为图像,然后通过功能`extract_feats_pretrained_cnn`中的预训练`VGG16`卷积神经网络处理这些视频帧。 。 在通过`VGG16`处理视频中的图像之前,需要从视频中对其进行采样。 我们从视频中采样图像,使每个视频具有`80`帧。 处理来自`VGG16``80`图像帧后,每个视频将具有`80`特征向量`f[1], f[2], ..., f[80]`。 这些功能将被馈送到 LSTM 以生成文本序列。 我们在 Keras 中使用了预训练的`VGG16`模型。 我们创建一个`VideoCaptioningPreProcessing`类,该类首先通过函数`video_to_frames`从每个视频中提取`80`视频帧作为图像,然后通过功能`extract_feats_pretrained_cnn`中的预训练`VGG16`卷积神经网络处理这些视频帧。 。
...@@ -118,7 +118,7 @@ o1, o2, . . . . . ot . . . oN = { "A ","man" "in" "a" "yellow" "helmet" "is" "wo ...@@ -118,7 +118,7 @@ o1, o2, . . . . . ot . . . oN = { "A ","man" "in" "a" "yellow" "helmet" "is" "wo
从前面的代码中,我们可以看到在`video_to_frames`功能中,`ffmpeg`工具用于将 JPEG 格式的视频图像帧转换。 为图像帧指定为`ffmpeg`的尺寸为`300 x 400`。 有关`ffmpeg`工具的更多信息,[请参考以下链接](https://www.ffmpeg.org/) 从前面的代码中,我们可以看到在`video_to_frames`功能中,`ffmpeg`工具用于将 JPEG 格式的视频图像帧转换。 为图像帧指定为`ffmpeg`的尺寸为`300 x 400`。 有关`ffmpeg`工具的更多信息,[请参考以下链接](https://www.ffmpeg.org/)
`extract_feats_pretrained_cnnfunction`中已建立了从最后一个完全连接的层中提取特征的预训练 CNN 模型。 该函数的代码如下: `extract_feats_pretrained_cnnfunction`中已建立了从最后一个全连接层中提取特征的预训练 CNN 模型。 该函数的代码如下:
```py ```py
# Extract the features from the pre-trained CNN # Extract the features from the pre-trained CNN
...@@ -161,7 +161,7 @@ o1, o2, . . . . . ot . . . oN = { "A ","man" "in" "a" "yellow" "helmet" "is" "wo ...@@ -161,7 +161,7 @@ o1, o2, . . . . . ot . . . oN = { "A ","man" "in" "a" "yellow" "helmet" "is" "wo
shutil.rmtree(self.temp_dest) shutil.rmtree(self.temp_dest)
``` ```
我们首先使用`model_cnn_load`函数加载经过预训练的 CNN 模型,然后针对每个视频,根据`ffmpeg.`指定的采样频率,使用`video_to_frames`函数将多个视频帧提取为图像。 图像通过`ffmpeg`创建的视频中的图像帧,但是我们使用`np.linspace`功能拍摄了`80`等距图像帧。 使用`load_image`功能将`ffmpeg`生成的图像调整为`224 x 224`的空间尺寸。 最后,将这些调整大小后的图像通过预训练的 VGG16 卷积神经网络(CNN),并提取输出层之前的最后一个全连接层的输出作为特征。 这些提取的特征向量存储在`numpy`数组中,并在下一阶段由 LSTM 网络进行处理以产生视频字幕。 本节中定义的功能`model_cnn_load`功能定义如下: 我们首先使用`model_cnn_load`函数加载经过预训练的 CNN 模型,然后针对每个视频,根据`ffmpeg.`指定的采样频率,使用`video_to_frames`函数将多个视频帧提取为图像。 图像通过`ffmpeg`创建的视频中的图像帧,但是我们使用`np.linspace`功能拍摄了`80`等距图像帧。 使用`load_image`功能将`ffmpeg`生成的图像调整为`224 x 224`的空间尺寸。 最后,将这些调整大小后的图像通过预训练的 VGG16 卷积神经网络(CNN),并提取输出层之前的最后一个全连接层的输出作为特征。 这些提取的特征向量存储在`numpy`数组中,并在下一阶段由 LSTM 网络进行处理以产生视频字幕。 本节中定义的功能`model_cnn_load`功能定义如下:
```py ```py
def model_cnn_load(self): def model_cnn_load(self):
...@@ -856,4 +856,4 @@ python Video_seq2seq.py process_main --path_prj '/media/santanu/9eb9b6dc-b380-48 ...@@ -856,4 +856,4 @@ python Video_seq2seq.py process_main --path_prj '/media/santanu/9eb9b6dc-b380-48
# 概要 # 概要
现在,我们已经完成了令人兴奋的视频字幕项目的结尾。 您应该能够使用 TensorFlow 和 Keras 构建自己的视频字幕系统。 您还应该能够使用本章中介绍的技术知识来开发其他涉及卷积神经网络和递归神经网络的高级模型。 下一章将使用受限的 Boltzmann 机器构建智能的推荐系统。 期待您的参与! 现在,我们已经完成了令人兴奋的视频字幕项目的结尾。 您应该能够使用 TensorFlow 和 Keras 构建自己的视频字幕系统。 您还应该能够使用本章中介绍的技术知识来开发其他涉及卷积神经网络和循环神经网络的高级模型。 下一章将使用受限的 Boltzmann 机器构建智能的推荐系统。 期待您的参与!
\ No newline at end of file \ No newline at end of file
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
# Android 应用中的电影评论评分 # Android 应用中的电影评论评分
我们将构建一个 Android 应用,该应用将基于电影评论的情感分析,将电影评论作为输入,并提供从`0``5`的等级作为输出。 首先将训练递归神经网络的 LSTM 版本,以对电影的情感进行二进制分类。 训练数据将由基于文本的电影评论以及`0``1`的二进制标签组成。 标签`1`代表评论带有正面情绪,而`0`则代表电影带有负面情绪。 从模型中,我们将预测情绪为正的可能性,然后将可能性放大五倍,以将其转换为合理的等级。 将使用 TensorFlow 构建模型,然后将训练后的模型转换为优化的冻结 protobuf 对象,以与 Android 应用程序逻辑集成。 冻结对象的大小将比原始训练模型小得多,并且仅用于推理目的。 我们将构建一个 Android 应用,该应用将基于电影评论的情感分析,将电影评论作为输入,并提供从`0``5`的等级作为输出。 首先将训练循环神经网络的 LSTM 版本,以对电影的情感进行二进制分类。 训练数据将由基于文本的电影评论以及`0``1`的二进制标签组成。 标签`1`代表评论带有正面情绪,而`0`则代表电影带有负面情绪。 从模型中,我们将预测情绪为正的可能性,然后将可能性放大五倍,以将其转换为合理的等级。 将使用 TensorFlow 构建模型,然后将训练后的模型转换为优化的冻结 protobuf 对象,以与 Android 应用程序逻辑集成。 冻结对象的大小将比原始训练模型小得多,并且仅用于推理目的。
我们将使用以下论文中标题为[《学习单词向量进行情感分析》](http://ai.stanford.edu/~amaas/data/sentiment/)的可用数据集: 我们将使用以下论文中标题为[《学习单词向量进行情感分析》](http://ai.stanford.edu/~amaas/data/sentiment/)的可用数据集:
...@@ -207,7 +207,7 @@ records_processed 50000 ...@@ -207,7 +207,7 @@ records_processed 50000
# 建立模型 # 建立模型
我们将构建一个简单的 LSTM 版本的递归神经网络,在输入层之后有一个嵌入层。 使用预训练的尺寸为 100 的 Glove 向量初始化嵌入层字向量,并将该层定义为`trainable`,以便字向量嵌入可以根据训练数据进行更新。 隐藏状态和单元状态的维数也保持为`100`。 使用二进制交叉熵损失训练模型。 为避免过度拟合,将脊正则化添加到损失函数中。 **Adam 优化器** ***,*** 用于训练模型。 我们将构建一个简单的 LSTM 版本的循环神经网络,在输入层之后有一个嵌入层。 使用预训练的尺寸为 100 的 Glove 向量初始化嵌入层字向量,并将该层定义为`trainable`,以便字向量嵌入可以根据训练数据进行更新。 隐藏状态和单元状态的维数也保持为`100`。 使用二进制交叉熵损失训练模型。 为避免过度拟合,将脊正则化添加到损失函数中。 **Adam 优化器** ***,*** 用于训练模型。
以下代码段显示了用于在 TensorFlow 中构建模型的函数: 以下代码段显示了用于在 TensorFlow 中构建模型的函数:
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
聊天机器人可以大致分为以下两类: 聊天机器人可以大致分为以下两类:
* **基于检索的模型**:这些模型通常依赖于查找表或知识库来从预定义的答案集中选择答案。 尽管这种方法看起来很幼稚,但是生产中的大多数聊天机器人都是这种类型的。 当然,从查找表或知识库中选择最佳答案可能会有各种复杂程度。 * **基于检索的模型**:这些模型通常依赖于查找表或知识库来从预定义的答案集中选择答案。 尽管这种方法看起来很幼稚,但是生产中的大多数聊天机器人都是这种类型的。 当然,从查找表或知识库中选择最佳答案可能会有各种复杂程度。
* **生成模型**:生成模型可即时生成响应,而不是采用基于查找的方法。 它们主要是概率模型或基于机器学习的模型。 直到最近,马尔可夫链大多被用作生成模型。 然而,随着深度学习的最新成功,基于递归神经网络的方法越来越受欢迎。 通常,RSTM 的 LSTM 版本被用作聊天机器人的生成模型,因为它更擅长处理长序列。 * **生成模型**:生成模型可即时生成响应,而不是采用基于查找的方法。 它们主要是概率模型或基于机器学习的模型。 直到最近,马尔可夫链大多被用作生成模型。 然而,随着深度学习的最新成功,基于循环神经网络的方法越来越受欢迎。 通常,RSTM 的 LSTM 版本被用作聊天机器人的生成模型,因为它更擅长处理长序列。
基于检索的模型和生成模型都具有各自的优缺点。 由于基于检索的模型从一组固定的答案中进行回答,因此它们无法处理看不见的问题或没有适当预定义响应的请求。 生成模型要复杂得多。 他们可以了解用户输入中的实体并生成类似人的响应。 但是,它们很难训练,并且通常需要更多的数据来训练。 他们还容易犯语法错误,而基于检索的模型则不会犯这些语法错误。 基于检索的模型和生成模型都具有各自的优缺点。 由于基于检索的模型从一组固定的答案中进行回答,因此它们无法处理看不见的问题或没有适当预定义响应的请求。 生成模型要复杂得多。 他们可以了解用户输入中的实体并生成类似人的响应。 但是,它们很难训练,并且通常需要更多的数据来训练。 他们还容易犯语法错误,而基于检索的模型则不会犯这些语法错误。
...@@ -134,7 +134,7 @@ def words_to_indices(self,sent): ...@@ -134,7 +134,7 @@ def words_to_indices(self,sent):
return word_indices return word_indices
``` ```
我们还希望将递归神经网络预测的单词索引转换为单词以形成句子。 此功能可以编码如下: 我们还希望将循环神经网络预测的单词索引转换为单词以形成句子。 此功能可以编码如下:
```py ```py
def indices_to_words(self,indices): def indices_to_words(self,indices):
...@@ -173,7 +173,7 @@ RNN 的 LSTM 版本用于构建序列到序列模型。 这是因为 LSTM 在记 ...@@ -173,7 +173,7 @@ RNN 的 LSTM 版本用于构建序列到序列模型。 这是因为 LSTM 在记
在此模型中,我们使用两个 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`表示词汇表中单词的数量。 在此模型中,我们使用两个 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`表示词汇表中单词的数量。
第二个 LSTM 用作解码器。 它试图将编码器 LSTM 创建的上下文向量![](img/4c8e1ab3-3b4e-4061-b674-5cbd46748052.png)解码为有意义的响应。 作为此方法的一部分,我们在每个时间步中将上下文向量与前一个单词一起馈入以生成当前单词。 在第一步中,我们没有任何先前的词可用于条件 LSTM,因此我们使用代理`START`词开始从解码器 LSTM 生成词序列的过程。 在推论过程中,我们在当前时间步输入前一个单词的方式与训练过程中使用的方法不同。 在训练中,由于我们在每个时间步都知道`apriori`之前的单词,因此相应地输入它们没有任何问题。 但是,在推论期间,由于我们在当前时间步上没有实际的前一个单词,因此会反馈前一个时间步上的预测单词。 每个时间步`t`的隐藏状态![](img/99084dfb-e5ab-4074-ad44-01bb8d36b1d3.png)在最终的最大 softmax`N`之前通过几个完全连接的层馈送。 在此 softmax 层中获得最大概率的单词是时间步长的预测单词。 然后将这个字输入到下一步的输入,即解码器 LSTM 的步骤`t + 1` 第二个 LSTM 用作解码器。 它试图将编码器 LSTM 创建的上下文向量![](img/4c8e1ab3-3b4e-4061-b674-5cbd46748052.png)解码为有意义的响应。 作为此方法的一部分,我们在每个时间步中将上下文向量与前一个单词一起馈入以生成当前单词。 在第一步中,我们没有任何先前的词可用于条件 LSTM,因此我们使用代理`START`词开始从解码器 LSTM 生成词序列的过程。 在推论过程中,我们在当前时间步输入前一个单词的方式与训练过程中使用的方法不同。 在训练中,由于我们在每个时间步都知道`apriori`之前的单词,因此相应地输入它们没有任何问题。 但是,在推论期间,由于我们在当前时间步上没有实际的前一个单词,因此会反馈前一个时间步上的预测单词。 每个时间步`t`的隐藏状态![](img/99084dfb-e5ab-4074-ad44-01bb8d36b1d3.png)在最终的最大 softmax`N`之前通过几个全连接层馈送。 在此 softmax 层中获得最大概率的单词是时间步长的预测单词。 然后将这个字输入到下一步的输入,即解码器 LSTM 的步骤`t + 1`
Keras 中的`TimeDistributed`函数允许在解码器 LSTM 的每个时间步长获得预测的有效实现,如以下代码所示: Keras 中的`TimeDistributed`函数允许在解码器 LSTM 的每个时间步长获得预测的有效实现,如以下代码所示:
......
...@@ -136,7 +136,7 @@ y = tf.placeholder(tf.int64) ...@@ -136,7 +136,7 @@ y = tf.placeholder(tf.int64)
![](img/dfff9daa-7bfb-4207-bb88-7419a4c8654a.png) ![](img/dfff9daa-7bfb-4207-bb88-7419a4c8654a.png)
在第 3 行中,我们初始化程序中的所有变量。 现在,在这里,我们没有任何明确的变量。 但是,内部的变量是完全连接的`fully_connected`函数是我们包含权重的所有隐藏层的地方。 这些就是变量,这就是为什么我们必须使用`global_ variables_initializer`对象初始化变量并运行此节点的原因。 对于每个时期,我们运行此循环 20 次。 现在,对于批次数量超过 80 的示例数量中的每次迭代,我们将获得要素和目标的值。 因此,每次迭代将有 80 个数据点。 然后,我们运行训练操作,并将通过`x`; 我们将传递特征值,在这里我们将传递目标值。 请记住,`x``y`是我们的占位符。 然后,我们评估训练的准确性,然后评估测试数据集中的准确性,从而获得测试数据集。 我们来自`mnist.test.images`,因此现在这些都是功能,`test.labels`是目标。 然后,在这两个循环完成之后,我们将打印两个精度。 在第 3 行中,我们初始化程序中的所有变量。 现在,在这里,我们没有任何明确的变量。 但是,内部的变量是全连接`fully_connected`函数是我们包含权重的所有隐藏层的地方。 这些就是变量,这就是为什么我们必须使用`global_ variables_initializer`对象初始化变量并运行此节点的原因。 对于每个时期,我们运行此循环 20 次。 现在,对于批次数量超过 80 的示例数量中的每次迭代,我们将获得要素和目标的值。 因此,每次迭代将有 80 个数据点。 然后,我们运行训练操作,并将通过`x`; 我们将传递特征值,在这里我们将传递目标值。 请记住,`x``y`是我们的占位符。 然后,我们评估训练的准确性,然后评估测试数据集中的准确性,从而获得测试数据集。 我们来自`mnist.test.images`,因此现在这些都是功能,`test.labels`是目标。 然后,在这两个循环完成之后,我们将打印两个精度。
然后,我们为测试数据集中的前 15 张图像生成一些单独的预测。 运行此步骤后,我们获得了第一个纪元,其训练准确度为 86%,测试准确度为 88-89%。 以下屏幕截图显示了训练的结果以及不同时期的测试结果: 然后,我们为测试数据集中的前 15 张图像生成一些单独的预测。 运行此步骤后,我们获得了第一个纪元,其训练准确度为 86%,测试准确度为 88-89%。 以下屏幕截图显示了训练的结果以及不同时期的测试结果:
...@@ -224,7 +224,7 @@ y = tf.placeholder(y_train.dtype) ...@@ -224,7 +224,7 @@ y = tf.placeholder(y_train.dtype)
# 建立 DNN # 建立 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) ![](img/e509c688-e82a-44e0-a99b-1abce7126c60.png)
......
...@@ -73,7 +73,7 @@ my_model.add(layer_1) ...@@ -73,7 +73,7 @@ my_model.add(layer_1)
my_model.add(layer_n) my_model.add(layer_n)
``` ```
假设您要建立一个描述完全连接的神经网络的模型(也称为**多层感知器****MLP**)),以对具有五个属性的一维记录进行二进制分类。 我们的模型包括四个完全连接的层。 纯粹出于说明目的,我们假设每个完全连接的层包含 10 个节点或神经元。 这些层中的每一层都使用**整流线性单元****ReLU**)激活功能。 最终输出通过`softmax`层获取。 可以在相应层的构造函数中定义特定于层的自定义。 实现此模型的代码如下: 假设您要建立一个描述全连接神经网络的模型(也称为**多层感知器****MLP**)),以对具有五个属性的一维记录进行二进制分类。 我们的模型包括四个全连接层。 纯粹出于说明目的,我们假设每个全连接层包含 10 个节点或神经元。 这些层中的每一层都使用**整流线性单元****ReLU**)激活功能。 最终输出通过`softmax`层获取。 可以在相应层的构造函数中定义特定于层的自定义。 实现此模型的代码如下:
```py ```py
model = tf.keras.Sequential() model = tf.keras.Sequential()
......
...@@ -598,4 +598,4 @@ WIT 的某些功能是可以将具有相同工作流程的多个模型进行比 ...@@ -598,4 +598,4 @@ WIT 的某些功能是可以将具有相同工作流程的多个模型进行比
# 进一步阅读 # 进一步阅读
鼓励用户阅读[这里](https://www.tensorflow.org/)的迁移学习指南,该指南重用了预先训练的模型权重和变量,[并将学习表示迁移到另一个数据集](https://www.tensorflow.org/beta/tutoriaimg/transfer_learning) 鼓励用户阅读[这里](https://www.tensorflow.org/)的迁移学习指南,该指南重用了预训练的模型权重和变量,[并将学习表示迁移到另一个数据集](https://www.tensorflow.org/beta/tutoriaimg/transfer_learning)
\ No newline at end of file \ No newline at end of file
...@@ -16,7 +16,7 @@ TFLite 的基本开发工作流程是选择模型,转换模型,将其部署 ...@@ -16,7 +16,7 @@ TFLite 的基本开发工作流程是选择模型,转换模型,将其部署
# TFLite 入门 # TFLite 入门
使用 TFLite 的第一步是选择要转换和使用的模型。 这包括使用预训练的模型,定制训练的模型或微调的模型。 TFLite 团队提供了一组预训练和预转换的模型,可以解决各种机器学习问题。 这些包括图像分类,对象检测,智能回复,姿势估计和分割。 使用经过微调的模型或经过定制训练的模型需要另一步骤,将它们转换为 TFLite 格式。 使用 TFLite 的第一步是选择要转换和使用的模型。 这包括使用预训练的模型,定制训练的模型或微调的模型。 TFLite 团队提供了一组预训练和预转换的模型,可以解决各种机器学习问题。 这些包括图像分类,对象检测,智能回复,姿势估计和分割。 使用经过微调的模型或经过定制训练的模型需要另一步骤,将它们转换为 TFLite 格式。
TFLite 旨在在设备上高效地执行模型,而这种效率的某些内在原因来自用于存储模型的特殊格式。 TF 模型必须先转换为这种格式,然后才能使用... TFLite 旨在在设备上高效地执行模型,而这种效率的某些内在原因来自用于存储模型的特殊格式。 TF 模型必须先转换为这种格式,然后才能使用...
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册