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 的区别 的相关文章

  • PyTorch:tensor.cuda()和tensor.to(torch.device(“cuda:0”))之间有什么区别?

    在 PyTorch 中 以下两种将张量 或模型 发送到 GPU 的方法有什么区别 Setup X np array 1 3 2 3 2 3 5 6 1 2 3 4 X model X torch DoubleTensor X Method
  • PyTorch - 参数不变

    为了了解 pytorch 的工作原理 我尝试对多元正态分布中的一些参数进行最大似然估计 然而 它似乎不适用于任何协方差相关的参数 所以我的问题是 为什么这段代码不起作用 import torch def make covariance ma
  • PoseWarping:如何矢量化此 for 循环(z 缓冲区)

    我正在尝试使用地面真实深度图 姿势信息和相机矩阵将帧从视图 1 扭曲到视图 2 我已经能够删除大部分 for 循环并将其矢量化 除了一个 for 循环 扭曲时 由于遮挡 视图 1 中的多个像素可能会映射到视图 2 中的单个位置 在这种情况下
  • Pytorch:了解 nn.Module 类内部如何工作

    一般来说 一个nn Module可以由子类继承 如下所示 def init weights m if type m nn Linear torch nn init xavier uniform m weight class LinearRe
  • 预训练 Transformer 模型的配置更改

    我正在尝试为重整变压器实现一个分类头 分类头工作正常 但是当我尝试更改配置参数之一 config axis pos shape 即模型的序列长度参数时 它会抛出错误 Reformer embeddings position embeddin
  • 查找张量中沿轴的非零元素的数量

    我想找到沿特定轴的张量中非零元素的数量 有没有 PyTorch 函数可以做到这一点 我尝试使用非零 http pytorch org docs master torch html highlight nonzero torch nonzer
  • Matlab - 访问多维数组的一部分

    我正在尝试访问 Matlab 中多维数组的一部分 可以这样做 X 2 3 1 20 5 4 7 然而 元素的数量和范围都不是固定的 所以我想提供数组的索引 对于上面的例子 它们是 ind1 2 1 5 4 ind2 3 20 5 7 对于固
  • 为什么 PyTorch nn.Module.cuda() 不将模块张量移动到 GPU,而仅将参数和缓冲区移动到 GPU?

    nn Module cuda 将所有模型参数和缓冲区移动到 GPU 但为什么不是模型成员张量呢 class ToyModule torch nn Module def init self gt None super ToyModule se
  • 为什么 RNN 需要两个偏置向量?

    In Pytorch RNN 实现 http pytorch org docs master nn html highlight rnn torch nn RNN 有两个偏差 b ih and b hh 为什么是这样 它与使用一种偏差有什么
  • 如何在pytorch中查看DataLoader中的数据

    我在 Github 上的示例中看到类似以下内容 如何查看该数据的类型 形状和其他属性 train data MyDataset int 1e3 length 50 train iterator DataLoader train data b
  • 在非单一维度 1 处,张量 a (2) 的大小必须与张量 b (39) 的大小匹配

    这是我第一次从事文本分类工作 我正在使用 CamemBert 进行二进制文本分类 使用 fast bert 库 该库主要受到 fastai 的启发 当我运行下面的代码时 from fast bert data cls import Bert
  • 从打包序列中获取每个序列的最后一项

    我试图通过 GRU 放置打包和填充的序列 并检索每个序列最后一项的输出 当然我的意思不是 1项目 但实际上是最后一个 未填充的项目 我们预先知道序列的长度 因此应该很容易为每个序列提取length 1 item 我尝试了以下方法 impor
  • pytorch 中的 keras.layers.Masking 相当于什么?

    我有时间序列序列 我需要通过将零填充到矩阵中并在 keras 中使用 keras layers Masking 来将序列的长度固定为一个数字 我可以忽略这些填充的零以进行进一步的计算 我想知道它怎么可能在 Pytorch 中完成 要么我需要
  • 如何更新 PyTorch 中神经网络的参数?

    假设我想将神经网络的所有参数相乘PyTorch 继承自的类的实例torch nn Module http pytorch org docs master nn html torch nn Module by 0 9 我该怎么做呢 Let n
  • 如何计算 CNN 第一个线性层的维度

    目前 我正在使用 CNN 其中附加了一个完全连接的层 并且我正在使用尺寸为 32x32 的 3 通道图像 我想知道是否有一个一致的公式可以用来计算第一个线性层的输入尺寸和最后一个卷积 最大池层的输入 我希望能够计算第一个线性层的尺寸 仅给出
  • Pytorch 损失为 nan

    我正在尝试用 pytorch 编写我的第一个神经网络 不幸的是 当我想要得到损失时遇到了问题 出现以下错误信息 RuntimeError Function LogSoftmaxBackward0 returned nan values in
  • Pytorch GPU 使用率低

    我正在尝试 pytorch 的例子https pytorch org tutorials beginner blitz cifar10 tutorial html https pytorch org tutorials beginner b
  • PyTorch 中的连接张量

    我有一个张量叫做data形状的 128 4 150 150 其中 128 是批量大小 4 是通道数 最后 2 个维度是高度和宽度 我有另一个张量叫做fake形状的 128 1 150 150 我想放弃最后一个list array从第 2 维
  • 如何在 PyTorch 中对子集使用不同的数据增强

    如何针对不同的情况使用不同的数据增强 转换 Subset在 PyTorch 中吗 例如 train test torch utils data random split dataset 80000 2000 train and test将具
  • 在Pytorch中计算欧几里得范数..理解和实现上的麻烦

    我见过另一个 StackOverflow 线程讨论计算欧几里德范数的各种实现 但我很难理解特定实现的原因 如何工作 该代码可以在 MMD 指标的实现中找到 https github com josipd torch two sample b

随机推荐

  • 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从原有的计算图中分