PyTorch中 tensor.detach() 和 tensor.data 的区别

以 a.data, a.detach() 为例:
两种方法均会返回和a相同的tensor,且与原tensor a 共享数据,一方改变,则另一方也改变。

所起的作用均是将变量tensor从原有的计算图中分离出来,分离所得tensor的requires_grad = False。

不同点:

  • data是一个属性,.detach()是一个方法;
  • data是不安全的,.detach()是安全的;
>>> a = torch.tensor([1,2,3.], requires_grad =True)
>>> out = a.sigmoid()
>>> c = out.data
>>> c.zero_()
tensor([ 0., 0., 0.])

>>> out                   #  out的数值被c.zero_()修改
tensor([ 0., 0., 0.])

>>> out.sum().backward()  #  反向传播
>>> a.grad                #  这个结果很严重的错误,因为out已经改变了
tensor([ 0., 0., 0.])

为什么.data是不安全的?

这是因为,当我们修改分离后的tensor,从而导致原tensora发生改变。PyTorch的自动求导Autograd是无法捕捉到这种变化的,会依然按照求导规则进行求导,导致计算出错误的导数值。

其风险性在于,如果我在某一处修改了某一个变量,求导的时候也无法得知这一修改,可能会在不知情的情况下计算出错误的导数值。

>>> a = torch.tensor([1,2,3.], requires_grad =True)
>>> out = a.sigmoid()
>>> c = out.detach()
>>> c.zero_()
tensor([ 0., 0., 0.])

>>> out                   #  out的值被c.zero_()修改 !!
tensor([ 0., 0., 0.])

>>> out.sum().backward()  #  需要原来out得值,但是已经被c.zero_()覆盖了,结果报错
RuntimeError: one of the variables needed for gradient
computation has been modified by an


那么.detach()为什么是安全的?

使用.detach()的好处在于,若是出现上述情况,Autograd可以检测出某一处变量已经发生了改变,进而以如下形式报错,从而避免了错误的求导。

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).

从以上可以看出,是在前向传播的过程中使用就地操作(In-place operation)导致了这一问题,那么就地操作是什么呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/6771.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯30天真题冲刺|题解报告|第三十天

大家好,我是snippet,今天是我们这次蓝桥省赛前一起刷题的最后一天了,今天打了一场力扣周赛,前面3个题都是有思路的,第三个题只过了一半的案例,后面看完大佬们的题解彻悟,下面是我今天的题解 目录…

蓝桥杯备考

数论:判断素数,鸽笼定理,抽屉理论 注意事项: long类型的数后面要加L long s 2658417853L; 保留几位小数: System.out.printf(“%.2f”, arg); 四舍五入问题:比如保留两位小数,就在数的后面再…

java基础知识汇总

目录 1、Java基础语法 1、类型转换问题 1. 运算符 1.1 算术运算符(理解) 1.2 赋值运算符(应用) 1.3 自增自减运算符(理解) 1.4 关系运算符(应用) 1.5 逻辑运算符&#xff08…

【CSS】清除浮动 ④ ( 清除浮动 - 使用双伪元素清除浮动 | 代码示例 )

文章目录一、清除浮动 - 使用双伪元素清除浮动二、代码示例一、清除浮动 - 使用双伪元素清除浮动 为 .clearfix:before 和 .clearfix:after 并集选择器 , 设置如下样式 : /* 清除浮动 - 使用双伪元素清除浮动 */.clearfix:before,.clearfix:after {content: "";displ…

ERTEC200P-2 PROFINET设备完全开发手册(1)

本教程为ERTEC200P-2的基础开发教程,可以掌握PN设备开发的基本流程。虽然没有涉及PN协议的详细解析,但是希望根据本文档多多练习,熟能生巧,逐渐能够掌握PN设备开发。 (注意:本手册基于西门子DEVKIT V47协议…

oracle导入的表中文名称乱码无法删除导致删除用户也失败

由于一开始弄数据库的时候忘记设置编码格式, 导致导入dmp文件之后带中文的表名变成了乱码 然后plsql右键删除表显示表不存在 一开始的时候寻思备份下表结构跟表数据 直接删除用户完事了 删除用户报递归遍历错误 寻思重装这个数据库太过于耗时 不值当的 就是看那几…

【JWT鉴权】如何来写一个token令牌认证登录?

目录一. 🦁 话题引入1.2 什么是JWT?二. 🦁 技术体现2.1 引入依赖2.2 编写JWT工具类2.3 编写登录方法2.4 编写JWT拦截器验证令牌2.5 编写要配置拦截的接口三. 🦁 话题终结一. 🦁 话题引入 在做项目过程中,我…

【halcon】为啥匹配到ROI外面去了?

背景 匹配到ROI外面去了 中心恰好在roi有效区域内!(粉色是ROI区域) 网上查到的资料! PaintRegion改变外部环境 //HOperatorSet.ReduceDomain(image, ho_ProductRegionAll, out imgReduced); //替换为: HObject all…

Web前端 HTML、CSS

HTML与CSSHTML、CSS思维导图一、HTML1.1、HTML基础文本标签1.2、图片、音频、视频标签1.3、超链接、表格标签1.4、布局1.5、表单标签1.6、表单项标签综合使用1.7、HTML小结二、CSS(简介)2.1、引入方式2.2、选择器2.3、CSS属性Web前端开发总览 Html&…

Linux基础操作 常用命令 Centos

Linux 1.Linux的引言 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器操作系统方面保持…

面试题-学习网络协议必备:七层模型与协议之间的映射关系

一、概念 OSI七层模型是计算机网络中的一种标准化分类和描述方式,它将网络协议划分为不同的层次,每个层次负责不同的功能。这种模型被广泛应用于网络设计、开发和维护,以便于不同系统之间的互操作性和相互通信。 二、各层介绍 第一层&#x…

vue项目代理配置大全

1.vite (vue3-admin-element-template-master) server: {host: 0.0.0.0, //服务器ip地址 port: 5566, //本地端口fs: {strict: false, // 支持引用除入口目录的文件},open: true, // 是否自动在浏览器打开proxy: {/pcapi: {target: https:....../pcapi…

老板想要可视化大屏?零代码开发3D可视化大屏,只要10分钟

上周末和供应链管理的朋友一起喝茶,我吐槽着我做报表的繁琐, 他用很疑惑的眼神看着我说:这事不是在模板上改改数据就行了吗?我连忙逼他给我分享了这个香饽饽。 回到家,我直接开始研究起了可视化大屏,后悔自…

Android告别Shape.xml

天下苦shape.xml久已,特别是遇上不靠谱的UI,圆角背景色边框,三个属性就能给你折腾出来几百种组合,每个组合都要写对应的shape.xml,太折腾人了! 展示 效果图 代码 /*** 设置shape*/ BindingAdapter(// 圆角…

44学习自动化运维工具 Chef 的基本用法,包括厨师编写、节点管理

Chef是一种自动化运维工具,它允许您定义基础设施的状态,并根据需要管理这些状态。在这里,我们将学习Chef的基本用法,包括如何编写和管理Cookbook和Node。 安装Chef 在使用Chef之前,您需要在管理节点和目标节点上安装…

图最短路径算法

图最短路径算法迪杰斯特拉算法弗洛伊德算法BFS迪杰斯特拉算法 求原点0到其他点的最短路径 #include<iostream> #include<vector> #include<string.h> #define N 10 #define INF 65535 using namespace std;int graph[N][N]; int dist[N]; int parent[N];/…

达梦数据库DISQL常用命令

1.帮助 HELP 作用&#xff1a;可以帮助用户查看其他命令的具体用法。用户可以看到其他命令系统显示的内容。 语法如下&#xff1a; HELP <command> 示例如下&#xff1a; 2.输出文件 SPOOL 作用&#xff1a;将屏幕显示的内容输出到指定文件 语法如下&#xff1a; …

JVM 类的加载过程

文章目录1 类的生命周期2 类加载过程2.1 加载2.2 验证2.3 准备2.4 解析2.5 初始化3 类卸载1 类的生命周期 类从被加载到虚拟机内存中开始到卸载出内存为止&#xff0c;它的整个生命周期可以简单概括为 7 个阶段&#xff1a;&#xff1a;加载&#xff08;Loading&#xff09;、…

和开振学Spring boot 3.0之Spring MVC:③Spring MVC的配置

我们前面两篇做了基本的开发&#xff0c;相信大家对Spring MVC的流程有了基本的了解&#xff0c;这些我们来确认一下一些细节。 1、Spring MVC是如何初始化的 在Servlet 3.0规范中&#xff0c;web.xml再也不是一个必需的配置文件。为了适应这个规范&#xff0c;Spring MVC从3…
最新文章