Pytorch 中的detach 和detach_
本文转自 http://blog.csdn.net/u012436149/article/details/76714349
pytorch 的 Variable 对象中有两个方法,detach和 detach_ 本文主要介绍这两个方法的效果和 能用这两个方法干什么
detach
官方文档中,对这个方法是这么介绍的。
- 返回一个新的 从当前图中分离的 Variable。
- 返回的 Variable 永远不会需要梯度
- 如果 被 detach 的Variable volatile=True, 那么 detach 出来的 volatile 也为 True
- 还有一个注意事项,即:返回的 Variable 和 被 detach 的Variable 指向同一个 tensor
import torch
from torch.nn import init
from torch.autograd import Variable
t1 = torch.FloatTensor([1., 2.])
v1 = Variable(t1)
t2 = torch.FloatTensor([2., 3.])
v2 = Variable(t2)
v3 = v1 + v2
v3_detached = v3.detach()
v3_detached.data.add_(t1) # 修改了 v3_detached Variable中 tensor 的值
print(v3, v3_detached) # v3 中tensor 的值也会改变
# detach 的源码
def detach(self):result = NoGrad()(self) # this is needed, because it merges version countersresult._grad_fn = Nonereturn result
detach_
官网给的解释是:将 Variable 从创建它的 graph 中分离,把它作为叶子节点。
从源码中也可以看出这一点
- 将 Variable 的grad_fn 设置为 None,这样,BP 的时候,到这个 Variable 就找不到 它的 grad_fn,所以就不会再往后BP了。
- 将 requires_grad 设置为 False。这个感觉大可不必,但是既然源码中这么写了,如果有需要梯度的话可以再手动 将 requires_grad 设置为 true
# detach_ 的源码
def detach_(self):"""Detaches the Variable from the graph that created it, making it aleaf."""self._grad_fn = Noneself.requires_grad = False
能用来干啥
如果我们有两个网络 A,BA,B, 两个关系是这样的 y=A(x),z=B(y)y=A(x),z=B(y) 现在我们想用 z.backward()z.backward() 来为 BB 网络的参数来求梯度,但是又不想求 AA 网络参数的梯度。我们可以这样:
# y=A(x), z=B(y) 求B中参数的梯度,不求A中参数的梯度
# 第一种方法
y = A(x)
z = B(y.detach())
z.backward()# 第二种方法
y = A(x)
y.detach_()
z = B(y)
z.backward()
在这种情况下,detach 和 detach_
都可以用。但是如果 你也想用 yy 来对 AA 进行 BP 呢?那就只能用第一种方法了。因为 第二种方法 已经将 AA 模型的输出 给 detach(分离)了。
Pytorch 中的detach 和detach_相关推荐
- pytorch中的.detach()和detach_()和.data和.cpu()和.item()的深入详解与区别联系
detach().detach_()和data detach()与detach_() 在x->y->z传播中,如果我们对y进行detach(),梯度还是能正常传播的: 但如果我们对y进行d ...
- Pytorch中的detach用法
该方法主要应用在Variable变量上,作用是从分离出一个tensor,值和原Variable一样,但是不需要计算梯度. 其源码如下: def detach(self):result = NoGrad ...
- pytorch中的detach()函数的作用
detach() 官方文档中,对这个方法是这么介绍的. 返回一个新的从当前图中分离的 Variable. 返回的 Variable 永远不会需要梯度 如果 被 detach 的Variable vol ...
- PyTorch中 tensor.detach() 和 tensor.data 的区别
原文链接请参考:https://dreamhomes.top/posts/201906081516/ PyTorch0.4中,.data 仍保留,但建议使用 .detach(), 区别在于 .data ...
- pytorch中的.detach和.data深入详解
前言:这两个方法都可以用来从原有的计算图中分离出某一个tensor,有相似的地方,也有不同的地方,下面来比较性的看一看.PyTorch0.4以及之后的版本中,.data 仍保留,但建议使用 .deta ...
- pytorch: Variable detach 与 detach_
pytorch 的 Variable 对象中有两个方法,detach和 detach_ 本文主要介绍这两个方法的效果和 能用这两个方法干什么. detach 官方文档中,对这个方法是这么介绍的. 返回 ...
- pytorch:.detach()、.detach_()的作用和区别
文章目录 pytorch的两个函数:.detach()..detach_()的作用和区别 一.torch.detach() 二.tensor.detach_() 补充:requires_grad.gr ...
- pytorch 中的Tensor.detach介绍
detach的作用 Tensor.detach() 的作用是阻断反向梯度传播,当我们再训练网络的时候可能希望保持一部分的网络参数不变,只对其中一部分的参数进行调整:或者值训练部分分支网络,并不让其梯度 ...
- Pytorch中的梯度知识总结
文章目录 1.叶节点.中间节点.梯度计算 2.叶子张量 leaf tensor (叶子节点) (detach) 2.1 为什么需要叶子节点? 2.2 detach()将节点剥离成叶子节点 2.3 什么 ...
最新文章
- 听说,英特尔要对外开放 x86 授权?
- 深入理解计算机系统:网络编程 上
- 利用HttpClient 获取网页数据java代码模版
- 存储过程——介绍(一)
- Team Foundation Server简介
- Android异常总结---Test run failed:Unable to find instrumentation target package
- 序列中连续值之间的差值列表
- 捕鱼分鱼、出售鱼、平分七筐鱼
- 早期关节炎患者延迟就诊风湿专科的长期影响
- 小技巧:电脑怎么卸载软件?
- EOVA_JFINAL实现分布式架构
- 2021年Java开发爆款推荐!黑马java培训视频网盘下载
- 《线粒体疾病的遗传》学习笔记
- 金融科技成为服贸会热议话题:数字化转型中如何保障金融安全
- java date 年龄_Java 根据年月日精确计算年龄
- Android作业批改系统(后台管理+前台app)
- java word根据标识符替换图片,文字(亲测)
- 【CPU GPU TPU】机器学习扫盲篇
- HBuilder:实现箭头向上悬浮
- 洗地机和扫地机器人哪个实用?值得入手的洗地机十大品牌推荐
热门文章
- 为了实现自动控制处理,需要计算机具有的基础条件是( ),计算机应用基础考试试卷(电大本科)...
- 厉害了我的哥!十一月居然有这么多好总结!
- 工业相机(高速相机)与普通相机的差别
- end kernel panic not syncing
- html中打印部分内容,设置网页打印区域
- 《ZigBee开发笔记》第五部分 外设篇 - 基础实验 第2章 CC2530温湿度传感器DHT11
- Mybatis的truncate table方法与SQL语句delete的区别
- JVM 学习(2)—简单理解Java 四大引用(强、软、弱、虚)
- shell下删除文件末尾的空行
- mysql查最高薪水,使用子查询查找MySQL Employee表的最高和第二最高薪水?