1.介绍

在使用PyTorch的过程中,我们经常会遇到detach() 、detach_()和 data这三种类别,如果你不详细分析它们的使用场所,的确是很容易让人懵逼。

1)detach()与detach_()

在x->y->z传播中,如果我们对y进行detach(),梯度还是能正常传播的,但如果我们对y进行detach_(),就把x->y->z切成两部分:x和y->z,x就无法接受到后面传过来的梯度

2)detach()和data

共同点:x.data(x.detach()) 返回和 x 的相同数据 tensor, 这个新的tensor和原来的tensor(即x)是共用数据的,一者改变,另一者也会跟着改变,且require s_grad = False

不同点: x.data 不能被 autograd 追踪求微分,即使被改了也能错误求导,而x.detach()则不行

2.代码

import torcha = torch.tensor([1, 2, 3.], requires_grad=True)
print(a)
out = a.tanh()
print(out)
c = out.data  # 需要走注意的是,通过.data “分离”得到的的变量会和原来的变量共用同样的数据,而且新分离得到的张量是不可求导的,c发生了变化,原来的张量也会发生变化
c.zero_() # 改变c的值,原来的out也会改变
print(c.requires_grad)
print(c)
print(out.requires_grad)
print(out)
print("----------------------------------------------")out.sum().backward()  # 对原来的out求导,
print(a.grad)  # 不会报错,但是结果却并不正确#输出
tensor([1., 2., 3.], requires_grad=True)
tensor([0.7616, 0.9640, 0.9951], grad_fn=<TanhBackward>)
False
tensor([0., 0., 0.])
True
tensor([0., 0., 0.], grad_fn=<TanhBackward>)
----------------------------------------------
tensor([1., 1., 1.])
import torcha = torch.tensor([1, 2, 3.], requires_grad=True)
print(a)
out = a.tanh()
print(out)
c = out.detach()  # 需要走注意的是,通过.detach() “分离”得到的的变量会和原来的变量共用同样的数据,而且新分离得到的张量是不可求导的,c发生了变化,原来的张量也会发生变化
c.zero_()  # 改变c的值,原来的out也会改变
print(c.requires_grad)
print(c)
print(out.requires_grad)
print(out)
print("----------------------------------------------")out.sum().backward()  # 对原来的out求导,
print(a.grad)  # 此时会报错,错误结果参考下面,显示梯度计算所需要的张量已经被“原位操作inplace”所更改了。# 输出
tensor([1., 2., 3.], requires_grad=True)
tensor([0.7616, 0.9640, 0.9951], grad_fn=<TanhBackward>)
False
tensor([0., 0., 0.])
True
tensor([0., 0., 0.], grad_fn=<TanhBackward>)
----------------------------------------------
Traceback (most recent call last):File "E:/python/TCL/entropy_coding_project/test_code/test27.py", line 15, in <module>out.sum().backward()  # 对原来的out求导,File "D:\ProgramData\Anaconda3\lib\site-packages\torch\tensor.py", line 107, in backwardtorch.autograd.backward(self, gradient, retain_graph, create_graph)File "D:\ProgramData\Anaconda3\lib\site-packages\torch\autograd\__init__.py", line 93, in backwardallow_unreachable=True)  # allow_unreachable flag
RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.FloatTensor [3]], which is output 0 of TanhBackward, is at version 1; expected version 0 instead. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).

PyTorch中 detach() 、detach_()和 data 的区别相关推荐

  1. 【pytorch】.detach() .detach_() 和 .data==>用于切断反向传播

    当我们再训练网络的时候可能 希望保持一部分的网络参数不变,只对其中一部分的参数进行调整: 或者只训练部分分支网络,并不让其梯度对主网络的梯度造成影响, 这时候我们就需要使用detach()函数来切断一 ...

  2. axios中的params和data的区别

    axios中的params和data是用来携带请求参数的两个属性. params是用来携带请求参数的,它以key-value的形式放在URL后面,是一个对象. data是用来携带请求数据的,它以key ...

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

    原文链接请参考:https://dreamhomes.top/posts/201906081516/ PyTorch0.4中,.data 仍保留,但建议使用 .detach(), 区别在于 .data ...

  4. pytorch .detach() .detach_() 和 .data用于切断反向传播

    参考:https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-autograd/#detachsource 当我们再训 ...

  5. pytorch:.detach()、.detach_()的作用和区别

    文章目录 pytorch的两个函数:.detach()..detach_()的作用和区别 一.torch.detach() 二.tensor.detach_() 补充:requires_grad.gr ...

  6. 简单介绍pytorch中分布式训练DDP使用 (结合实例,快速入门)

    文章目录 DDP原理 pytorch中DDP使用 相关的概念 使用流程 如何启动 torch.distributed.launch spawn调用方式 针对实例voxceleb_trainer多卡介绍 ...

  7. pytorch中的.detach()和detach_()和.data和.cpu()和.item()的深入详解与区别联系

    detach().detach_()和data detach()与detach_() 在x->y->z传播中,如果我们对y进行detach(),梯度还是能正常传播的: 但如果我们对y进行d ...

  8. pytorch中的.detach和.data深入详解

    前言:这两个方法都可以用来从原有的计算图中分离出某一个tensor,有相似的地方,也有不同的地方,下面来比较性的看一看.PyTorch0.4以及之后的版本中,.data 仍保留,但建议使用 .deta ...

  9. detach detach_ pytorch

    pytorch中的detach和detach_ pytorch 的 Variable 对象中有两个方法,detach和 detach_ : detach 官方文档中,对这个方法是这么介绍的. 返回一个 ...

  10. pytorch网络冻结的三种方法区别:detach、requires_grad、with_no_grad

    pytorch网络冻结的三种方法区别:detach.requires_grad.with_no_grad 文章目录 pytorch网络冻结的三种方法区别:detach.requires_grad.wi ...

最新文章

  1. oss对象存储服务操作
  2. 「时事点评」我有一个预感,保时捷女车主丈夫要残了!
  3. Go 语言编程 — Profiling 性能分析
  4. 配置文件详解_Keepalived配置文件详解
  5. python 读plt文件_用python读Excel文件
  6. addcslashes php,php addcslashes函数怎么用
  7. 谈谈C#中的三个关键词new , virtual , override
  8. OpenShift 4 Hands-on Lab (10) 限制集群资源的使用量
  9. 算法导论 练习12.2
  10. 基于微服务和Docker的PaaS云平台架构设计
  11. 正态分布下含绝对值的期望求解 -- 待验证
  12. C++多线程map读写加锁
  13. qt label显示图片_Qt官方示例-QML Axes
  14. Extjs 4.1 学习笔记(二)(panel 自适应高度)
  15. OCR应用场景:票总管发票管理系统
  16. zemax中如何和matlab中通信,如何在ZEMAX及MATLAB之间通信.doc
  17. SDUT 3337 计算长方体、四棱锥的表面积和体积
  18. 神经计算棒python_将Pytorch模型部署到Movidius神经计算棒
  19. word字体号对应的磅数
  20. WeChatTweak-微信小助手 v1.2.2 详细安装教程

热门文章

  1. 抽取word中的背景图
  2. “企业级零代码黑客马拉松”决赛圆满落幕
  3. VUE系列 ---- 网络模块axios(一 )
  4. 异构应用异构数据库用魔方智能中间件FIX平台转化
  5. 国足2-0击败菲律宾,重获出线主动权,下次对战叙利亚做了哪些准备?
  6. 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」
  7. t6服务器的系统数据库不存在,用友T6软件出纳管理系统数据库质疑用任何方法无法恢复时解决方法-用友T6...
  8. SP商BI平台(MP子平台)——通信增值业务运营SP公司
  9. 计算机网络管理工程师证书考试试题,(信息化知识)国家信息化人才考试计算机网络工程师模拟试题.pdf...
  10. Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册