首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >pytorch 学习笔记(二十二):关于 inplace operation

pytorch 学习笔记(二十二):关于 inplace operation

作者头像
ke1th
发布于 2019-05-26 04:25:32
发布于 2019-05-26 04:25:32
3.2K00
代码可运行
举报
运行总次数:0
代码可运行

(本文章适用于 pytorch0.4.0 版本, 既然 Variable 和 Tensor merge 到一块了, 那就叫 Tensor吧)

在编写 pytorch 代码的时候, 如果模型很复杂, 代码写的很随意, 那么很有可能就会碰到由 inplace operation 导致的问题. 所以本文将对 pytorch 的 inplace operation 做一个简单的总结.

在 pytorch 中, 有两种情况不能使用 inplace operation:

  • 对于 requires_grad=True 的 叶子张量(leaf tensor) 不能使用 inplace operation
  • 对于在 求梯度阶段需要用到的张量 不能使用 inplace operation

下面将通过代码来说明以上两种情况:

第一种情况: requires_grad=True 的 leaf tensor

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch

w = torch.FloatTensor(10) # w 是个 leaf tensor
w.requires_grad = True    # 将 requires_grad 设置为 True
w.normal_()               # 在执行这句话就会报错
# 报错信息为
#  RuntimeError: a leaf Variable that requires grad has been used in an in-place operation.

很多人可能会有疑问, 模型的参数就是 requires_grad=true 的 leaf tensor, 那么模型参数的初始化应该怎么执行呢? 如果看一下 nn.Module._apply() 的代码, 这问题就会很清楚了

w.data = w.data.normal() # 可以使用曲线救国的方法来初始化参数

第二种情况: 求梯度阶段需要用到的张量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
x = torch.FloatTensor([[1., 2.]])
w1 = torch.FloatTensor([[2.], [1.]])
w2 = torch.FloatTensor([3.])
w1.requires_grad = True
w2.requires_grad = True

d = torch.matmul(x, w1)
f = torch.matmul(d, w2)
d[:] = 1 # 因为这句, 代码报错了 RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation

f.backward()

为什么呢?

因为 f=matmul(d, w2) , ∂f∂w2=g(d)∂f∂w2=g(d)\frac{\partial f}{\partial w2} = g(d) , f 对于 w2 的导数是关于 d 的函数:

  • 在计算 f 的时候, d 是等于某个值的, f 对于 w2 的导数是和这时候的 d 值相关的
  • 但是计算完 f 之后, d 的值变了, 这就会导致 f.backward() 对于 w2 的导数计算出错误, 为了防止这种错误, pytorch 选择了报错的形式.
  • 造成这个问题的主要原因是因为 在执行 f = torch.matmul(d, w2) 这句的时候, pytorch 的反向求导机制 保存了 d 的引用为了之后的 反向求导计算.
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
x = torch.FloatTensor([[1., 2.]])
w1 = torch.FloatTensor([[2.], [1.]])
w2 = torch.FloatTensor([3.])
w1.requires_grad = True
w2.requires_grad = True

d = torch.matmul(x, w1)
d[:] = 1   # 稍微调换一下位置, 就没有问题了
f = torch.matmul(d, w2)
f.backward()

最后再提一下 .data 与 .detach(), (这部分翻译自 pytorch0.4.0 的 release note):

在 0.4.0 版本之前, .data 的语义是 获取 Variable 的 内部 Tensor, 在 0.4.0 版本将 Variable 和 Tensor merge 之后, .data 和之前有类似的 语义, 也是 内部的 Tensor 的概念.

x.datax.detach() 返回的 tensor 有相同的地方, 也有不同的地方:

相同:

  • 都和 x 共享同一块数据
  • 都和 x 的 计算历史无关
  • requires_grad = False

不同:

  • y=x.data 在某些情况下不安全, 某些情况, 指的就是 上述 inplace operation 的第二种情况
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
x = torch.FloatTensor([[1., 2.]])
w1 = torch.FloatTensor([[2.], [1.]])
w2 = torch.FloatTensor([3.])
w1.requires_grad = True
w2.requires_grad = True

d = torch.matmul(x, w1)

d_ = d.data

f = torch.matmul(d, w2)
d_[:] = 1

f.backward()

# 这段代码没有报错, 但是计算上的确错了
# 如果 打印 w2.grad 结果看一下的话, 得到 是 1, 但是正确的结果应该是 4.

上述代码应该报错, 因为:

  • d_ 和 d 共享同一块数据,
  • 改 d_ 就相当于 改 d 了
  • 但是, 代码并没有报错 , 但是计算上的确错了

所以, release note 中指出, 如果想要 detach 的效果的话, 还是 detach() 安全一些.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
x = torch.FloatTensor([[1., 2.]])
w1 = torch.FloatTensor([[2.], [1.]])
w2 = torch.FloatTensor([3.])
w1.requires_grad = True
w2.requires_grad = True

d = torch.matmul(x, w1)

d_ = d.detach() # 换成 .detach(), 就可以看到 程序报错了...

f = torch.matmul(d, w2)
d_[:] = 1
f.backward()

Enjoy the pytorch :)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年06月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Excel减法函数怎么使用?这五个技巧你得会
给Excel中A列与B列数据的做减法,在单元格C1中输入“=”,然后点击A1,再输入“-”点击B1,最后点击回车键就可以了。然后把光标移动到C1右下角直到出现“+”,然后下拉得出数据。
高效办公
2019/09/10
11.7K0
Excel减法函数怎么使用?这五个技巧你得会
Excel 常用的九十九个技巧 Office 自学教程快速掌握办公技巧
Microsoft Excel 是微软为 Windows、macOS、Android 和 iOS 开发的电子表格软件,可以用来制作电子表格、完成许多复杂的数据运算,进行数据的分析和预测,并且具有强大的制作图表的功能。由于 Excel 具有十分友好的人机界面和强大的计算功能,它已成为国内外广大用户管理公司和个人财务、统计数据、绘制各种专业化表格的得力助手。允许用户自定义界面的电子制表软件包括字体、文字属性和单元格格式,它还引进了智能重算的功能,当单元格数据变动时,只有与之相关的数据才会更新,荒岛本次带来九十九个 Excel 技巧,提高您的办公效率。
ximagine
2023/05/05
9K0
Excel实战技巧:从Excel预测的正态分布中返回随机数
使用表格模拟,可以在电子表格一行的多个单元格中创建整个模型,其中一些单元格包括随机数。
fanjy
2023/02/24
2.7K0
Excel实战技巧:从Excel预测的正态分布中返回随机数
如何生成不重复的随机数
要想获取不重复的随机数,我们需要一点小技巧。例如,想要获取21个不重复的随机数,可以先将21个数字按顺序排序,然后再从中选择所需的数字,这样可以避免出现任何重复数。
fanjy
2023/09/28
9270
如何生成不重复的随机数
Excel小技巧71:让RAND函数生成的随机数固定不变
有时候,我们使用RAND函数生成了一系列随机数,但是不希望它们经常改变。可以以粘贴值的方式将它们粘贴到另一组单元格,但这样的话,它们就永远固定下来了;还可以使用VBA代码。其实,还可以使用Excel的模拟运算表功能。
fanjy
2020/12/08
19.6K0
Excel小技巧71:让RAND函数生成的随机数固定不变
Excel表格中最经典的36个小技巧,全在这儿了
技巧1、单元格内强制换行 技巧2、锁定标题行 技巧3、打印标题行 技巧4、查找重复值 技巧5、删除重复值 技巧6、快速输入对号√ 技巧7、万元显示 技巧8、隐藏0值 技巧9、隐藏单元格所有值。 技巧10、单元格中输入00001 技巧11、按月填充日期 技巧12、合并多个单元格内容 技巧13、防止重复录入 技巧14、公式转数值 技巧15、小数变整数 技巧16、快速插入多行 技巧17、两列互换 技巧18、批量设置求和公式 技巧19、同时查看一个excel文件的两个工作表。 技巧20:同时修改多个工作表 技巧21:恢复未保存文件 技巧22、给excel文件添加打开密码 技巧23、快速关闭所有excel文件 技巧24、制作下拉菜单 技巧25、二级联动下拉 技巧27、删除空白行 技巧28、表格只能填写不能修改 技巧29、文字跨列居中显示 技巧30、批注添加图片 技巧31、批量隐藏和显示批注 技巧32、解决数字不能求和 技巧33、隔行插入空行 技巧34、快速调整最适合列宽 技巧35、快速复制公式 技巧36、合并单元格筛选
Ai学习的老章
2019/09/25
9.3K0
Excel表格中最经典的36个小技巧,全在这儿了
office相关操作
选中不冻的一行的下一行,在视图中打开冻结窗格,即可让上面的内容一直显示,还可以使用拆分功能
用户6841540
2024/08/02
1.5K0
技巧:Excel用得好,天天没烦恼
分析公司DarkHorse Analytics 从美国劳工统计处获得数据,并制作了这张二十四小时会唿吸的地图,显示曼哈顿的工作与在宅人口。
IT阅读排行榜
2018/08/16
2.3K0
技巧:Excel用得好,天天没烦恼
Excel小技巧 -- 持续更新
trim函数会删除目标的“首、尾”空格,如果把数字类型trim后会转为文本类型,需要用VALUE函数重新转换成为数字。示例:TRIM(A1)会把A1的前后空格都去掉,中间的空格仍然在。
浩Coding
2022/08/30
1.9K0
Excel小技巧 -- 持续更新
Excel 技巧篇-在指定范围内生成指定小数位的随机数
如果我们想要在指定范围内生成指定小数位的随机数,就需要变形了。 下面我来举两个例子:
小蓝枣
2020/09/23
10.8K0
随机数函数
今天给大家分享几种常用的随机数函数! ▼ 在excel中生成随机数虽然不是很频繁的需求,但是简单了解几个随机数生成方式,偶尔还是很有帮助的。因为我们时常需要使用一组随机数来模拟实验或者制作虚拟的案例数
数据小磨坊
2018/04/10
3.8K0
随机数函数
excel常用操作大全
例如,在excel中输入单位的人员信息后,如果需要在原出生年份的数字前再加两位数字,即在每个人的出生年份前再加两位数字19,如果逐个修改太麻烦,那么我们可以使用以下方法来节省时间和精力:
崩天的勾玉
2021/12/20
23.2K0
excel常用操作大全
翻译 | 简单而有效的EXCEL数据分析小技巧
介绍 我一直很欣赏EXCEL蕴藏的巨大能量。这款软件不仅具备基本的数据运算,还能使用它对数据进行分析。EXCEL被广泛运用到很多领域,例如:金融建模和商业预测。对于刚进入数据分析行业新手来说,EXCEL可以被当做一款入门的软件。 甚至在学习R或Python前,对于新入门的小白来说,事先掌握一定的EXCEL知识是百利而无一害。EXCEL凭借其功能强大的函数、可视化图表、以及整齐排列的电子表格功能,使你能够快速而深入的洞察到数据不轻易为人所知的一面。 但与此同时,EXCEL也有它的一些不足之处,即它无法非常有
CDA数据分析师
2018/02/13
4.1K0
翻译 | 简单而有效的EXCEL数据分析小技巧
Excel公式技巧40: 对数据随机排序
有时候,为公平起见,我们会将一组数据随机排序。如下图1所示,在列D中对列C中的数据随机排序。
fanjy
2020/07/29
5.3K0
Excel公式技巧40: 对数据随机排序
Excel单元格内计算式及字符串拼接实现
&:逻辑并,用以拼接字符串 =:计算式求结果 " ":其内部放入要显示的字符串
代码咖啡
2018/08/28
1.3K0
Excel单元格内计算式及字符串拼接实现
随机点名,RAND函数应用示例
将表中列A命名为:listNames(即,=tblNames[姓名]);列B命名为:listRandnum(即,=tblNames[随机数])。
fanjy
2022/03/09
2.4K0
随机点名,RAND函数应用示例
Excel技巧:创建数字列表的2种基本方法
本文讲解在Excel中创建数字列表的2种不同技巧。这些列表有静态列表,也有动态列表,动态列表会随着添加或删除项目而发生更改。
fanjy
2022/06/04
2.4K0
Excel技巧:创建数字列表的2种基本方法
Excel表格的35招必学秘技[配图]
一、让数据按需排序   如果你要将员工按其所在的部门进行排序,这些部门名称既的有关信息不是按拼音顺序,也不是按笔画顺序,怎么办?可采用自定义序列来排序。   1.执行“格式→选项”命令,打开“选项”
ytkah
2018/03/06
9.1K0
Excel表格的35招必学秘技[配图]
Excel小技巧77:6个简单的方法,批量应用公式到整列
公式使电子表格“活”了起来。有时,我们会在一个单元格或者多个单元格中应用公式,但在很多情况下,我们需要将公式应用于整列(或者一列中的许多单元格)。为此,Excel提供了多种不同的方法,你只需使用鼠标单击几次或者使用快捷键,就可以完成这样的操作。
fanjy
2021/02/05
70.4K0
excel常用操作
选中不懂的一行的下一行,在视图中打开冻结窗格,即可让上面的内容一直显示,还可以使用拆分功能
用户6841540
2024/08/19
6240
推荐阅读
相关推荐
Excel减法函数怎么使用?这五个技巧你得会
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验