Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
大唐爆破僧
apachecn-dl-zh
提交
ae0dcfc9
A
apachecn-dl-zh
项目概览
大唐爆破僧
/
apachecn-dl-zh
与 Fork 源项目一致
Fork自
OpenDocCN / apachecn-dl-zh
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
apachecn-dl-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ae0dcfc9
编写于
1月 18, 2021
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2021-01-18 17:11:33
上级
1de6a3f7
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
13 addition
and
13 deletion
+13
-13
new/pt-dl-handson/2.md
new/pt-dl-handson/2.md
+13
-13
未找到文件。
new/pt-dl-handson/2.md
浏览文件 @
ae0dcfc9
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录