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

2023-05-16

以 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)导致了这一问题,那么就地操作是什么呢?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyTorch中 tensor.detach() 和 tensor.data 的区别 的相关文章

随机推荐

  • Android硬件通信之 串口通信

    一 xff0c 串口介绍 1 1 串口简介 串行接口简称串口 xff0c 也称串行通信接口或串行通讯接口 xff08 通常指COM接口 xff09 xff0c 是采用串行通信方式的扩展接口 xff1b 串行接口 xff08 SerialIn
  • 【环境配置 skills】sublime 配置 MinGW 搭建 C/C++ 编程环境

    sublime 配置 MinGW 搭建 C C 43 43 编程环境 当安装好 MinGW 和 sublime text 后 xff0c 执行下面2个动作 xff1a 按照菜单 Tools 61 61 gt Build System 61
  • 【Java】npm 国内下载慢的问题解决

    打开 cmd 命令窗口使用淘宝 npm 镜像定制的 cnpm gzip 压缩支持 命令行工具代替默认的 npm xff1b 安装 cnpm 命令 xff1a npm install g cnpm registry 61 https regi
  • Python3之3天极速入门五迭代器与生成器

    34 34 34 Python3 迭代器与生成器 迭代是Python最强大的功能之一 xff0c 是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象 迭代器对象从集合的第一个元素开始访问 xff0c 直到所有的元素被访问完结束
  • 记一篇在sata固态上安装好系统的电脑上加装m2固态硬盘,是如何重装系统的

    倒腾了块三星的m2接口固态硬盘 xff0c 但是死活装不上系统 问了好多人终于解决了 xff0c 现在总结一下 xff0c 万一有人用得着 m2固态装好之后正常启动 我用的是大白菜制作工具 xff0c 按普通的做系统盘的方式做好一个启动盘
  • 睿客云盘更新日志

    睿客云盘PC版本 V3 0 7 睿客云盘PC版 更新内容 xff1a 1 修复登录客户端提示网络异常问题 2 修复视频文件右键打开播放失败问题 3 修复分享 64 我功能部分异常问题 4 新增支持睿客网账号登录 5 优化视频播放窗口 202
  • HDFS中web端查看/tmp目录与/user目录时权限不足的问题解决

    在查看browse directory时 xff0c 点击 tmp 或 user xff0c 无法进入 xff0c 报错 xff1a Permission denied user 61 dr who access 61 READ EXECU
  • 【WSL】WSL迁移教程

    写在前面 如果我们是通过Windows Store进行安装的 xff0c 就会默认安装到C盘 在使用过程中 xff0c WSL占用空间会越来越大 xff0c 很容易让C盘爆满 xff0c 所以我们需要将其迁移到其他非C盘的地方 终止正在运行
  • 【WSA】Win11 安卓子系统配置上网方法

    搜索系统环境变量 xff1a 在里面添加ADB的安装路径 xff1a 在终端里输入adb version xff0c 测试adb是否正常工作 xff1a 在终端里输入ipconfig xff0c 查看安卓子系统IP地址 xff1a 在终端输
  • 【WSA】Win11安卓子系统提示VirtWifi的连接受限的解决方法

    问题描述 每次WSA启动时都会有如下提示 xff1a 虽说不影响使用 xff0c 但是看着实在是闹心 解决方案 1 下载ADB工具 xff1a Platform tools下载 Platform tools 安卓调试工具包 官方版下载 系统
  • Centos CA自签证书服务器及自签证书配置手册

    Centos CA自签证书服务器及自签证书配置手册 1 准备工作1 1 系统版本信息1 2 创建必要的目录和文件 2 创建CA2 1 生成CA私钥文件 Key 2 2 生成CA自签名证书2 3 生成自签名证书 拓展部分 2 4 etc pk
  • AttributeError: ‘DataFrame‘ object has no attribute ‘ix‘

    问题原因 pandas版本0 20 0及其以后版本中 xff0c ix已经不被推荐使用 问题解决 使用loc和iloc替换 loc loc gets rows or columns with particular labels from t
  • 使用OLS摘要解释线性回归的结果

    下面是一个回归过程 xff0c 用于拟合收入和教育情况 span class token function import span pandas as pd span class token function import span mat
  • 夏皮罗-威尔克检验(Shapiro–Wilk test)

    1介绍 夏皮罗 威尔克检验是一种在频率上统计检验中检验正态性的方法 它在1965年由夏皮罗和威尔克发表 2 理论 Shapiro Wilk检验检验了样本x 1 xff0c xff0c x n来自正态分布总体的原假设 该检验统计量是 3 解解
  • KS检验

    1 KS 检验 xff08 Kolmogorov Smirnov test xff09 Kolmogorov Smirnov是比较一个频率分布f x 与理论分布g x 或者两个观测值分布的检验方法 其原假设H0 两个数据分布一致或者数据符合
  • git status 命令详解

    git status命令表示 xff1a 文件 xff0c 文件夹在工作区 xff0c 暂存区的状态 xff0c 下图就是文件 xff0c 文件夹三种状态 xff1a Changes to be committed use git rest
  • PyTorch 中的乘法:mul()、multiply()、matmul()、mm()、mv()、dot()

    torch mul 函数功能 xff1a 逐个对 input 和 other 中对应的元素相乘 本操作支持广播 xff0c 因此 input 和 other 均可以是张量或者数字 span class token keyword impor
  • Adblock Plus Rules 自用 2021

    Adblock Plus Rules obsolete ZhihuCSDNBilibiliBaidu 64 64 static zhihu com heifetz lib js 64 64 static zhihu com heifetz
  • pandas函数 apply、iterrows、iteritems、groupyby

    apply DataFrame span class token punctuation span span class token builtin apply span span class token punctuation span
  • PyTorch中 tensor.detach() 和 tensor.data 的区别

    以 a data a detach 为例 xff1a 两种方法均会返回和a相同的tensor xff0c 且与原tensor a 共享数据 xff0c 一方改变 xff0c 则另一方也改变 所起的作用均是将变量tensor从原有的计算图中分