本文转自 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_相关推荐

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

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

  2. Pytorch中的detach用法

    该方法主要应用在Variable变量上,作用是从分离出一个tensor,值和原Variable一样,但是不需要计算梯度. 其源码如下: def detach(self):result = NoGrad ...

  3. pytorch中的detach()函数的作用

    detach() 官方文档中,对这个方法是这么介绍的. 返回一个新的从当前图中分离的 Variable. 返回的 Variable 永远不会需要梯度 如果 被 detach 的Variable vol ...

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

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

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

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

  6. pytorch: Variable detach 与 detach_

    pytorch 的 Variable 对象中有两个方法,detach和 detach_ 本文主要介绍这两个方法的效果和 能用这两个方法干什么. detach 官方文档中,对这个方法是这么介绍的. 返回 ...

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

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

  8. pytorch 中的Tensor.detach介绍

    detach的作用 Tensor.detach() 的作用是阻断反向梯度传播,当我们再训练网络的时候可能希望保持一部分的网络参数不变,只对其中一部分的参数进行调整:或者值训练部分分支网络,并不让其梯度 ...

  9. Pytorch中的梯度知识总结

    文章目录 1.叶节点.中间节点.梯度计算 2.叶子张量 leaf tensor (叶子节点) (detach) 2.1 为什么需要叶子节点? 2.2 detach()将节点剥离成叶子节点 2.3 什么 ...

最新文章

  1. 听说,英特尔要对外开放 x86 授权?
  2. 深入理解计算机系统:网络编程 上
  3. 利用HttpClient 获取网页数据java代码模版
  4. 存储过程——介绍(一)
  5. Team Foundation Server简介
  6. Android异常总结---Test run failed:Unable to find instrumentation target package
  7. 序列中连续值之间的差值列表
  8. 捕鱼分鱼、出售鱼、平分七筐鱼
  9. 早期关节炎患者延迟就诊风湿专科的长期影响
  10. 小技巧:电脑怎么卸载软件?
  11. EOVA_JFINAL实现分布式架构
  12. 2021年Java开发爆款推荐!黑马java培训视频网盘下载
  13. 《线粒体疾病的遗传》学习笔记
  14. 金融科技成为服贸会热议话题:数字化转型中如何保障金融安全
  15. java date 年龄_Java 根据年月日精确计算年龄
  16. Android作业批改系统(后台管理+前台app)
  17. java word根据标识符替换图片,文字(亲测)
  18. 【CPU GPU TPU】机器学习扫盲篇
  19. HBuilder:实现箭头向上悬浮
  20. 洗地机和扫地机器人哪个实用?值得入手的洗地机十大品牌推荐

热门文章

  1. 为了实现自动控制处理,需要计算机具有的基础条件是( ),计算机应用基础考试试卷(电大本科)...
  2. 厉害了我的哥!十一月居然有这么多好总结!
  3. 工业相机(高速相机)与普通相机的差别
  4. end kernel panic not syncing
  5. html中打印部分内容,设置网页打印区域
  6. 《ZigBee开发笔记》第五部分 外设篇 - 基础实验 第2章 CC2530温湿度传感器DHT11
  7. Mybatis的truncate table方法与SQL语句delete的区别
  8. JVM 学习(2)—简单理解Java 四大引用(强、软、弱、虚)
  9. shell下删除文件末尾的空行
  10. mysql查最高薪水,使用子查询查找MySQL Employee表的最高和第二最高薪水?