提交 ae0dcfc9 编写于 作者: W wizardforcel

2021-01-18 17:11:33

上级 1de6a3f7
......@@ -16,7 +16,7 @@
根据维基百科的说法,Fizz buzz [1]是一款针对儿童的小组文字游戏,可以教他们有关分裂的知识。 玩家轮流进行递增计数。 被三整除的任何数字[2]被单词 fizz 替换,被五整除的任何数字被 buzz 单词替换。 两者均分的数字成为嘶嘶声。
**艾伦人工智能研究所****AI2**)的研究工程师之一乔尔·格鲁斯(Joel Grus)在一个有趣的示例中使用了 Fizz 嗡嗡声,而则在博客中发文[ 3]在 TensorFlow 上。 尽管该示例没有解决任何实际问题,但该博客文章颇具吸引力,很高兴看到神经网络如何学会从数字流中找到数学模式。
**艾伦人工智能研究所****AI2**)的研究工程师之一乔尔·格鲁斯(Joel Grus)在一个有趣的示例中使用了 Fizz 嗡嗡声,而则在博客中发文[3]在 TensorFlow 上。 尽管该示例没有解决任何实际问题,但该博客文章颇具吸引力,很高兴看到神经网络如何学会从数字流中找到数学模式。
## 数据集
......@@ -166,17 +166,17 @@ tensor([1.])
#### 张量的 Autograd 属性
当成为图形的一部分时,张量需要存储 autograd 自动区分所需的信息。 张量充当计算图中的一个节点,并通过功能模块实例连接到其他节点。 Tensor 实例主要具有支持 autograd 的三个属性:`.grad``.data``grad_fn()`(注意字母大小写:`Function`代表 PyTorch `Function`模块,而`function`代表 Python 函数)。
当成为图形的一部分时,张量需要存储 autograd 自动区分所需的信息。 张量充当计算图中的一个节点,并通过功能模块实例连接到其他节点。 张量实例主要具有支持 autograd 的三个属性:`.grad``.data``grad_fn()`(注意字母大小写:`Function`代表 PyTorch `Function`模块,而`function`代表 Python 函数)。
`.grad`属性在任何时间点存储梯度,所有向后调用将当前梯度累积到`.grad`属性。 `.data`属性可访问其中包含数据的裸张量对象。
![Autograd attributes of a tensor](img/B09475_02_05.jpg)
图 2.5:data,grad 和 grad_fn
图 2.5:`data``grad``grad_fn`
如果您想知道,前面的代码片段中的`required_grad`参数会通知张量或 autograd-engine 在进行反向传播时需要梯度。 创建张量时,可以指定是否需要该张量来承载梯度。 在我们的示例中,我们没有使用梯度更新输入张量(输入永远不会改变):我们只需要更改权重即可。 由于我们没有在迭代中更改输入,因此不需要输入张量即可计算梯度。 因此,在包装输入张量时,我们将`False`作为`required_grad`参数传递,对于权重,我们传递`True`。 检查我们之前创建的张量实例的`grad``data`属性。
如果您想知道,前面的代码片段中的`required_grad`参数会通知张量或 autograd 引擎在进行反向传播时需要梯度。 创建张量时,可以指定是否需要该张量来承载梯度。 在我们的示例中,我们没有使用梯度更新输入张量(输入永远不会改变):我们只需要更改权重即可。 由于我们没有在迭代中更改输入,因此不需要输入张量即可计算梯度。 因此,在包装输入张量时,我们将`False`作为`required_grad`参数传递,对于权重,我们传递`True`。 检查我们之前创建的张量实例的`grad``data`属性。
Tensor `Function`实例在图中时是相互连接的,并且一起构成了非循环计算图。 除了用户明确创建的张量以外,每个张量都连接到一个函数。 (如果用户未明确创建张量,则必须通过函数创建张量。例如,表达式`c = a + b`中的`c`由加法函数创建。 )您可以通过在张量上调用`grade_fn`来访问创建器功能。 打印`grad``.data``.grade_fn()`的值可得到以下结果:
`Tensor``Function`实例在图中时是相互连接的,并且一起构成了非循环计算图。 除了用户明确创建的张量以外,每个张量都连接到一个函数。 (如果用户未明确创建张量,则必须通过函数创建张量。例如,表达式`c = a + b`中的`c`由加法函数创建。 )您可以通过在张量上调用`grade_fn`来访问创建器功能。 打印`grad``.data``.grade_fn()`的值可得到以下结果:
```py
print(x.grad, x.grad_fn, x)
......@@ -400,7 +400,7 @@ class Linear(torch.nn.Module):
return input.matmul(self.weight.t()) + self.bias
```
该代码段是 PyTorch 源代码中 Linear 层的修改版本。 用`Parameter`包裹张量对于您来说似乎很奇怪,但是不必担心。 `Parameter`类将权重和偏差添加到模块参数列表中,当您调用`model.parameters()`时将可用。 初始化程序将所有参数保存为对象属性。 `forward`函数的功能与我们在上一示例中的自定义线性层中完全一样。
该代码段是 PyTorch 源代码中`Linear`层的修改版本。 用`Parameter`包裹张量对于您来说似乎很奇怪,但是不必担心。 `Parameter`类将权重和偏差添加到模块参数列表中,当您调用`model.parameters()`时将可用。 初始化程序将所有参数保存为对象属性。 `forward`函数的功能与我们在上一示例中的自定义线性层中完全一样。
```py
a2 = x_.matmul(w1)
......@@ -409,11 +409,11 @@ a2 = a2.add(b1)
在以后的章节中,我们将使用`nn.module`的更重要的功能。
##### apply()
##### `apply()`
此函数可帮助我们将自定义函数应用于模型的所有参数。 它通常用于进行自定义权重初始化,但是通常,`model_name.apply(custom_function)`对每个模型参数执行`custom_function`
##### cuda()和 cpu()
##### `cuda()`和`cpu()`
这些功能与我们之前讨论的目的相同。 但是,`model.cpu()`将所有参数转换为 CPU 张量,当您的模型中有多个参数并且分别转换每个参数很麻烦时,这非常方便。
......@@ -438,11 +438,11 @@ y = torch.from_numpy(trY).type(ytype)
我们不止于此。 如果您已开始在 GPU 上进行操作,并且在脚本之间进行了 CPU 优化的操作,则只需调用 CPU 方法即可将 GPU 张量转换为 CPU 张量,反之亦然。 我们将在以后的章节中看到这样的例子。
##### train()和 eval()
##### `train()`和`eval()`
就像名称所示,这些功能告诉 PyTorch 模型正在训练模式或评估模式下运行。 仅在要关闭或打开模块(例如`Dropout``BatchNorm`)时,此功能才有效。 在以后的章节中,我们将经常使用它们。
##### parameters()
##### `parameters()`
调用`parameters()`会返回所有模型参数,这对于优化程序或要使用参数进行实验非常有用。 在我们开发的新手模型中,它具有四个参数`w1``w2``b1``b2`,并且逐行使用梯度更新了参数。 但是,在`FizBuzNet`中,由于我们有一个模型类,并且尚未创建模型的权重和偏差,因此`.parameter()`调用是可行的方法。
......@@ -460,7 +460,7 @@ with torch.no_grad():
无需用户逐行写下的每个参数更新,我们可以归纳为`for`循环,因为`.parameters()`返回所有具有特殊张量并具有`.grad``.data`属性的参数。 我们有更好的方法来更新权重,但这是人们不需要像 Adam 这样的奇特更新策略时最常用和直观的方式之一。
##### zero_grad()
##### `zero_grad()`
这是一个方便的函数,可将梯度设为零。 但是,与我们在新手模型中执行此操作的方式不同,它是一个更简单,直接的函数调用。 使用`zero_grad`驱动的模型,我们不必查找每个参数并分别调用`zero_grad`,但是对模型对象的单个调用将使所有参数的梯度为零。
......@@ -468,7 +468,7 @@ with torch.no_grad():
`nn`模块具有丰富的,具有不同的层,您需要使用当前的深度学习技术来构建几乎所有内容。
`nn.Module`附带的一个重要层是顺序容器,如果模型的结构是连续且直接的,则它提供了一个易于使用的 API 来制作模型对象而无需用户编写类结构。 `FizBuzNet`结构为**线性 | Sigmoid | 线性 | Sigmoid**,可以通过单行代码用 Sequential 实现,这就像我们之前构建的`FizBuzNet`网络一样:
`nn.Module`附带的一个重要层是顺序容器,如果模型的结构是连续且直接的,则它提供了一个易于使用的 API 来制作模型对象而无需用户编写类结构。 `FizBuzNet`结构为**线性 | Sigmoid | 线性 | Sigmoid**,可以通过单行代码用`Sequential`实现,这就像我们之前构建的`FizBuzNet`网络一样:
```py
import torch.nn as nn
......@@ -557,7 +557,7 @@ with torch.no_grad():
但是,对于具有很多参数的大型模型,我们无法做到这一点。 更好的替代方法是像我们以前看到的那样循环遍历`net.parameters()`,但是这样做的主要缺点是,循环遍历了作为样板的 Python 中的参数。 此外,有不同的体重更新策略。 我们使用的是最基本的梯度下降方法。 复杂的方法可以处理学习率衰减,动量等等。 这些帮助网络比常规 SGD 更快地达到全局最小值。
`optim`包是 PyTorch 提供的替代方案,可有效处理重量更新。 除此之外,一旦使用模型参数初始化了优化器对象,用户就可以在其上调用`zero_grad`。 因此,不再像以前那样显式地在每个 weight-bias 参数上调用`zero_grad`
`optim`包是 PyTorch 提供的替代方案,可有效处理重量更新。 除此之外,一旦使用模型参数初始化了优化器对象,用户就可以在其上调用`zero_grad`。 因此,不再像以前那样显式地在每个权重和偏置参数上调用`zero_grad`
```py
w1.grad.zero_()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册