PyTorch中 detach() 、detach_()和 data 的区别
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 的区别相关推荐
- 【pytorch】.detach() .detach_() 和 .data==>用于切断反向传播
当我们再训练网络的时候可能 希望保持一部分的网络参数不变,只对其中一部分的参数进行调整: 或者只训练部分分支网络,并不让其梯度对主网络的梯度造成影响, 这时候我们就需要使用detach()函数来切断一 ...
- axios中的params和data的区别
axios中的params和data是用来携带请求参数的两个属性. params是用来携带请求参数的,它以key-value的形式放在URL后面,是一个对象. data是用来携带请求数据的,它以key ...
- PyTorch中 tensor.detach() 和 tensor.data 的区别
原文链接请参考:https://dreamhomes.top/posts/201906081516/ PyTorch0.4中,.data 仍保留,但建议使用 .detach(), 区别在于 .data ...
- pytorch .detach() .detach_() 和 .data用于切断反向传播
参考:https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-autograd/#detachsource 当我们再训 ...
- pytorch:.detach()、.detach_()的作用和区别
文章目录 pytorch的两个函数:.detach()..detach_()的作用和区别 一.torch.detach() 二.tensor.detach_() 补充:requires_grad.gr ...
- 简单介绍pytorch中分布式训练DDP使用 (结合实例,快速入门)
文章目录 DDP原理 pytorch中DDP使用 相关的概念 使用流程 如何启动 torch.distributed.launch spawn调用方式 针对实例voxceleb_trainer多卡介绍 ...
- pytorch中的.detach()和detach_()和.data和.cpu()和.item()的深入详解与区别联系
detach().detach_()和data detach()与detach_() 在x->y->z传播中,如果我们对y进行detach(),梯度还是能正常传播的: 但如果我们对y进行d ...
- pytorch中的.detach和.data深入详解
前言:这两个方法都可以用来从原有的计算图中分离出某一个tensor,有相似的地方,也有不同的地方,下面来比较性的看一看.PyTorch0.4以及之后的版本中,.data 仍保留,但建议使用 .deta ...
- detach detach_ pytorch
pytorch中的detach和detach_ pytorch 的 Variable 对象中有两个方法,detach和 detach_ : detach 官方文档中,对这个方法是这么介绍的. 返回一个 ...
- pytorch网络冻结的三种方法区别:detach、requires_grad、with_no_grad
pytorch网络冻结的三种方法区别:detach.requires_grad.with_no_grad 文章目录 pytorch网络冻结的三种方法区别:detach.requires_grad.wi ...
最新文章
- oss对象存储服务操作
- 「时事点评」我有一个预感,保时捷女车主丈夫要残了!
- Go 语言编程 — Profiling 性能分析
- 配置文件详解_Keepalived配置文件详解
- python 读plt文件_用python读Excel文件
- addcslashes php,php addcslashes函数怎么用
- 谈谈C#中的三个关键词new , virtual , override
- OpenShift 4 Hands-on Lab (10) 限制集群资源的使用量
- 算法导论 练习12.2
- 基于微服务和Docker的PaaS云平台架构设计
- 正态分布下含绝对值的期望求解 -- 待验证
- C++多线程map读写加锁
- qt label显示图片_Qt官方示例-QML Axes
- Extjs 4.1 学习笔记(二)(panel 自适应高度)
- OCR应用场景:票总管发票管理系统
- zemax中如何和matlab中通信,如何在ZEMAX及MATLAB之间通信.doc
- SDUT 3337 计算长方体、四棱锥的表面积和体积
- 神经计算棒python_将Pytorch模型部署到Movidius神经计算棒
- word字体号对应的磅数
- WeChatTweak-微信小助手 v1.2.2 详细安装教程
热门文章
- 抽取word中的背景图
- “企业级零代码黑客马拉松”决赛圆满落幕
- VUE系列 ---- 网络模块axios(一 )
- 异构应用异构数据库用魔方智能中间件FIX平台转化
- 国足2-0击败菲律宾,重获出线主动权,下次对战叙利亚做了哪些准备?
- 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」
- t6服务器的系统数据库不存在,用友T6软件出纳管理系统数据库质疑用任何方法无法恢复时解决方法-用友T6...
- SP商BI平台(MP子平台)——通信增值业务运营SP公司
- 计算机网络管理工程师证书考试试题,(信息化知识)国家信息化人才考试计算机网络工程师模拟试题.pdf...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册