提交 1de6a3f7 编写于 作者: W wizardforcel

2021-01-18 17:07:39

上级 08ef823a
......@@ -14,7 +14,7 @@
第 3 章,“深度学习工作流程”深入研究了深度学习工作流程的实现和有助于构建工作流程的 PyTorch 生态系统。 如果您打算为即将进行的项目建立深度学习团队或开发渠道,那么这可能是最关键的一章。 在本章中,我们将遍历深度学习管道的不同阶段,并了解 PyTorch 社区如何通过制作适当的工具在工作流程的每个阶段中不断改进。
第 4 章,“计算机视觉”是迄今为止深度学习最成功的结果,它讨论了成功背后的关键思想,并贯穿了使用最广泛的视觉算法– **卷积神经网络(CNN)**。 我们将逐步实现 CNN 以了解其工作原理,然后使用 PyTorch 的 nn 包中预定义的 CNN。 本章可帮助您制作简单的 CNN 和基于高级 CNN 的视觉算法,称为语义分割。
第 4 章,“计算机视觉”是迄今为止深度学习最成功的结果,它讨论了成功背后的关键思想,并贯穿了使用最广泛的视觉算法– **卷积神经网络(CNN)**。 我们将逐步实现 CNN 以了解其工作原理,然后使用 PyTorch 的`nn`包中预定义的 CNN。 本章可帮助您制作简单的 CNN 和基于高级 CNN 的视觉算法,称为语义分割。
第 5 章,“序列数据处理”着眼于循环神经网络,它是目前最成功的顺序数据处理算法。 本章向您介绍主要的 RNN 组件,例如**长短期记忆****LSTM**)网络和**门控循环单元****GRU**)。 然后,在探索循环神经网络之前,我们将经历 RNN 实现中的算法更改,例如双向 RNN,并增加层数。 为了理解递归网络,我们将使用斯坦福大学 NLP 小组的著名示例(堆栈增强的解析器-解释器神经网络(SPINN)),并将其在 PyTorch 中实现。
......@@ -44,9 +44,9 @@
下载文件后,请确保使用以下最新版本解压缩或解压缩文件夹:
* Windows 的 WinRAR / 7-Zip
* 适用于 macOS 的 Zipeg / iZip / UnRarX
* 适用于 Linux 的 7-Zip / PeaZip
* Windows 的 WinRAR/7-Zip
* 适用于 macOS 的 Zipeg/iZip/UnRarX
* 适用于 Linux 的 7-Zip/PeaZip
本书的代码包也托管在 [GitHub](https://github.com/hhsecond/HandsOnDeepLearningWithPytorch) 上。 我们还从[这里](https://github.com/PacktPublishing/)提供了丰富的书籍和视频目录中的其他代码包。 去看一下!
......
......@@ -252,9 +252,9 @@ for epoch in range(epochs):
图 1.11:Seq2seq 网络
自编码器是一种特殊的编码器-解码器网络,属于无监督学习类别。 自编码器尝试从未标记的数据中学习,将目标值设置为等于输入值。 例如,如果输入的图像尺寸为 100 x 100,则输入向量的尺寸为 10,000。 因此,输出大小也将为 10,000,但隐藏层的大小可能为 500。简而言之,您尝试将输入转换为较小尺寸的隐藏状态表示,从而从隐藏状态重新生成相同的输入 。
自编码器是一种特殊的编码器-解码器网络,属于无监督学习类别。 自编码器尝试从未标记的数据中学习,将目标值设置为等于输入值。 例如,如果输入的图像尺寸为`100 x 100`,则输入向量的尺寸为 10,000。 因此,输出大小也将为 10,000,但隐藏层的大小可能为 500。简而言之,您尝试将输入转换为较小尺寸的隐藏状态表示,从而从隐藏状态重新生成相同的输入 。
如果您能够训练一个可以做到这一点的神经网络,那么 voilà,您将找到一个很好的压缩算法,可以将高维输入以一个数量级的幅度传输到低维向量 获得。
如果您能够训练一个可以做到这一点的神经网络,那么,您将找到一个很好的压缩算法,可以将高维输入以一个数量级的幅度传输到低维向量 获得。
如今,自编码器被用于不同的情况和行业。 当我们讨论语义分割时,您将在第 4 章,“计算机视觉”中看到类似的架构。
......@@ -308,7 +308,7 @@ Figure 1.16: GAN setup
现代强化学习使用深度网络进行学习,这与我们以前明确编码那些规则的旧方法不同。 我们将研究 Q 学习和深度 Q 学习,向您展示有无深度学习的强化学习之间的区别。
强化学习被认为是通向一般智能的途径之一,在这种途径中,计算机或代理通过与现实世界,对象或实验的交互或从反馈中学习。 教一个强化学习代理人相当于通过负面和正面奖励来训练狗。 当您给一块饼干拿起球时,或者当您对狗不捡球而大喊时,您会通过消极和积极的奖励来增强对狗大脑的了解。 我们对 AI 代理执行相同的操作,但是正数奖励将为正数,负数奖励将为负数。 即使我们不能将强化学习视为类似于 CNN / RNN 等的另一种架构,但我还是在这里将其作为使用深度神经网络解决实际问题的另一种方法:
强化学习被认为是通向一般智能的途径之一,在这种途径中,计算机或代理通过与现实世界,对象或实验的交互或从反馈中学习。 教一个强化学习代理人相当于通过负面和正面奖励来训练狗。 当您给一块饼干拿起球时,或者当您对狗不捡球而大喊时,您会通过消极和积极的奖励来增强对狗大脑的了解。 我们对 AI 代理执行相同的操作,但是正数奖励将为正数,负数奖励将为负数。 即使我们不能将强化学习视为类似于 CNN/RNN 等的另一种架构,但我还是在这里将其作为使用深度神经网络解决实际问题的另一种方法:
![Reinforcement learning](img/B09475_01_17.jpg)
......@@ -363,7 +363,7 @@ GPU 张量
| 32 位整数(有符号) | `torch.IntTensor` | `torch.cuda.IntTensor` |
| 64 位整数(有符号) | `torch.LongTensor` | `torch.cuda.LongTensor` |
> 表 1.1:PyTorch 支持的数据类型。 资料来源:http://pytorch.org/docs/master/tensors.html
> 表 1.1:PyTorch 支持的数据类型。 [资料来源](http://pytorch.org/docs/master/tensors.html)
在每个版本中,PyTorch 都会对该 API 进行一些更改,以使所有可能的 API 都类似于 NumPy API。 形状是 0.2 版本中引入的那些更改之一。 调用`shape`属性可以得到张量的形状(在 PyTorch 术语中为大小),也可以通过`size`函数进行访问:
......@@ -458,11 +458,11 @@ tensor([[0.5594, 0.8875, 0.9234, 1.1294],
`split``chunk`是用于拆分张量的类似操作。 `split`接受每个输出张量要的大小。 例如,如果要在第 0 个维度上拆分大小为`3 x 2`的张量,尺寸为 1,则将得到三个大小均为`3 x 2`的张量。但是,如果在第 0 个维度上使用 2 作为大小,则将 会得到`3 x 2`的张量和另一个`3 x 2`的张量。
`squeeze`功能有时可以节省您的时间。 在某些情况下,您将具有一个或多个尺寸为 1 的张量。有时,您的张量中不需要那些多余的尺寸。 这就是`squeeze`将为您提供帮助的地方。 `squeeze`删除值为 1 的维。例如,如果您正在处理句子,并且有 10 个句子的批量,每个句子包含 5 个单词,则将其映射到张量对象时,将得到 10 x 的张量 5.然后,您意识到必须将其转换为一热向量,以便神经网络进行处理。
`squeeze`功能有时可以节省您的时间。 在某些情况下,您将具有一个或多个尺寸为 1 的张量。有时,您的张量中不需要那些多余的尺寸。 这就是`squeeze`将为您提供帮助的地方。 `squeeze`删除值为 1 的维。例如,如果您正在处理句子,并且有 10 个句子的批量,每个句子包含 5 个单词,则将其映射到张量对象时,将得到`10 x 5`的张量。然后,您意识到必须将其转换为一热向量,以便神经网络进行处理。
您可以使用大小为 100 的单热点编码向量为张量添加另一个维度(因为词汇量为 100 个单词)。 现在,您有了一个尺寸为`10 x 5 x 100`的张量对象,并且每个批量和每个句子一次传递一个单词。
现在,您必须对句子进行拆分和切分,最有可能的结果是,张量的大小为 10 x 1 x 100(每 10 个单词中的一个单词带有 100 维向量)。 您可以使用`10 x 100`的张量处理它,这使您的生活更加轻松。 继续使用`squeeze``10 x 1 x 100`张量得到`10 x 100`张量。
现在,您必须对句子进行拆分和切分,最有可能的结果是,张量的大小为`10 x 1 x 100`(每 10 个单词中的一个单词带有 100 维向量)。 您可以使用`10 x 100`的张量处理它,这使您的生活更加轻松。 继续使用`squeeze``10 x 1 x 100`张量得到`10 x 100`张量。
PyTorch 具有称为`unsqueeze`的防挤压操作,该操作会为张量对象添加另一个伪尺寸。 不要将`unsqueeze``stack`混淆,这也会增加另一个维度。 `unsqueeze`添加了伪尺寸,并且不需要其他张量,但是`stack`正在将其他形状相同的张量添加到参考张量的另一个尺寸中。
......@@ -480,11 +480,11 @@ PyTorch 具有称为`unsqueeze`的防挤压操作,该操作会为张量对象
互操作性是 PyTorch 自身发展的核心哲学之一。 开发团队投入了大量时间来实现不同框架(例如 ONNX,DLPack 等)之间的互操作性。 这些示例将在后面的章节中显示,但是在这里,我们将讨论 PyTorch 的内部设计如何在不影响速度的前提下满足这一要求。
普通的 Python 数据结构是可以保存数据和元数据的单层内存对象。 但是 PyTorch 数据结构是分层设计的,这使得该框架不仅可以互操作而且还可以提高内存效率。 PyTorch 核心的计算密集型部分已通过 ATen 和 Caffe2 库迁移到了 C / C++ 后端,而不是将其保留在 Python 本身中,以便提高速度。
普通的 Python 数据结构是可以保存数据和元数据的单层内存对象。 但是 PyTorch 数据结构是分层设计的,这使得该框架不仅可以互操作而且还可以提高内存效率。 PyTorch 核心的计算密集型部分已通过 ATen 和 Caffe2 库迁移到了 C/C++ 后端,而不是将其保留在 Python 本身中,以便提高速度。
即使将 PyTorch 创建为研究框架,也已将其转换为面向研究但可用于生产的框架。 通过引入两种执行类型,可以解决多用例需求所带来的折衷。 我们将在第 8 章和 *PyTorch 投入生产*中看到更多相关信息,我们将在其中讨论如何将 PyTorch 投入生产。
即使将 PyTorch 创建为研究框架,也已将其转换为面向研究但可用于生产的框架。 通过引入两种执行类型,可以解决多用例需求所带来的折衷。 我们将在第 8 章和“生产中的 PyTorch”中看到更多相关信息,我们将在其中讨论如何将 PyTorch 投入生产。
C / C++ 后端中设计的自定义数据结构已分为不同的层。 为简单起见,我们将省略 CUDA 数据结构,而将重点放在简单的 CPU 数据结构上。 PyTorch 中的面向用户的主要数据结构是`THTensor`对象,它保存有关尺寸,偏移,步幅等信息。 但是,`THTensor`存储的另一个主要信息是指向`THStorage`对象的指针,该对象是为存储而保存的张量对象的内部层。
C/C++ 后端中设计的自定义数据结构已分为不同的层。 为简单起见,我们将省略 CUDA 数据结构,而将重点放在简单的 CPU 数据结构上。 PyTorch 中的面向用户的主要数据结构是`THTensor`对象,它保存有关尺寸,偏移,步幅等信息。 但是,`THTensor`存储的另一个主要信息是指向`THStorage`对象的指针,该对象是为存储而保存的张量对象的内部层。
```py
x = torch.rand(2,3,4)
......@@ -534,7 +534,7 @@ print(with_fake_dimension) # added a fake zeroth dimension
正如您可能已经假设的那样,`THStorage`层不是一个智能数据结构,它实际上并不知道张量的元数据。 `THStorage`层负责保持指向原始数据和分配器的指针。 分配器完全是另一个主题,中有用于 CPU,GPU,共享内存等的不同分配器。 来自`THStorage`的指向**原始数据**的指针是互操作性的关键。 **原始数据**是存储实际数据的位置,但没有任何结构。 每个张量对象的这种三层表示使 PyTorch 的实现内存效率更高。 以下是一些示例。
将变量`x`创建为`2 x 2`的张量,并填充 1s。 然后,我们创建另一个变量`xv`,它是同一张量`x`的另一个视图。 我们将`2 x 2`张量展平为大小为 4 的单维张量。我们还通过调用`.NumPy()`方法并将其存储在变量`xn`中来创建 NumPy 数组:
将变量`x`创建为`2 x 2`的张量,并填充 1。 然后,我们创建另一个变量`xv`,它是同一张量`x`的另一个视图。 我们将`2 x 2`张量展平为大小为 4 的单维张量。我们还通过调用`.NumPy()`方法并将其存储在变量`xn`中来创建 NumPy 数组:
```py
>>> import torch
......
......@@ -409,7 +409,7 @@ transform = transforms.Compose(
#### 瓶颈和性能分析
PyTorch 的 Python 优先方法阻止核心团队在的第一年建立一个单独的探查器,但是当模块开始转向 C / C++ 内核时,就很明显需要在 Python 的 cProfiler 上安装一个独立的探查器,这就是 `autograd.profiler`故事的开始。
PyTorch 的 Python 优先方法阻止核心团队在的第一年建立一个单独的探查器,但是当模块开始转向 C/C++ 内核时,就很明显需要在 Python 的 cProfiler 上安装一个独立的探查器,这就是 `autograd.profiler`故事的开始。
本节将提供更多的表和统计信息,而不是分步指导,因为 PyTorch 已经使概要分析尽可能简单。 对于概要分析,我们将使用在第二章中开发的相同的 *FizzBu​​zz* 模型。 尽管`autograd.profiler`可以分析图形中的所有操作,但是在此示例中,仅分析了主网络的正向传播,而没有损失函数和后向通过。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册