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 的值也会改变
1
2
3
4
5
6
7
8
9
10
11
# detach 的源码
def detach(self):
result = NoGrad()(self) # this is needed, because it merges version counters
result._grad_fn = None
return result
1
2
3
4
5
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 a
leaf.
"""
self._grad_fn = None
self.requires_grad = False
1
2
3
4
5
6
7
能用来干啥

如果我们有两个网络 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()
1
2
3
4
5
6
7
8
9
10
11
在这种情况下,detach 和 detach_ 都可以用。但是如果 你也想用 yy 来对 AA 进行 BP 呢?那就只能用第一种方法了。因为 第二种方法 已经将 AA 模型的输出 给 detach(分离)了。
---------------------
作者:ke1th
来源:CSDN
原文:https://blog.csdn.net/u012436149/article/details/76714349
版权声明:本文为博主原创文章,转载请附上博文链接!

pytorch: Variable detach 与 detach_相关推荐

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

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

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

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

  3. Pytorch 中的detach 和detach_

    本文转自 http://blog.csdn.net/u012436149/article/details/76714349 pytorch 的 Variable 对象中有两个方法,detach和 de ...

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

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

  5. pytorch torch.detach函数(返回一个新的`Variable`,从当前图中分离下来的)

    detach()[source] Returns a new Variable, detached from the current graph. 返回一个新的Variable,从当前图中分离下来的. ...

  6. PyTorch Variable与Tensor 【详解】

    Variable 与 Tensor tensor 是 PyTorch 中的完美组件,高效的数据格式,但是构建神经网络还远远不够,我们需要能够构建计算图的 tensor,这就是 Variable.Var ...

  7. pytorch tensor.detach

    import torch as t x = t.ones(1, requires_grad=True) x.requires_grad #True y = t.ones(1, requires_gra ...

  8. 关于 detach()和detach_()的区别

    假设假设y是作为x的函数计算的,而z则是作为y和x的函数计算的.(y = x* x, z=y*x) 下面对于两个函数分别画出计算图: 1. detach() 如果对y使用detach(),那么在反向传 ...

  9. Pytorch——Variable是什么?

    文章目录 1.初识Variable 2. 计算Variable的梯度 3.获取 Variable 里面的数据 1.初识Variable 在 Torch 中的 Variable 就是一个存放会变化的值的 ...

最新文章

  1. 科技热点思考:元宇宙发展及其风险挑战
  2. yum 更新_CentOS7 - 使用yum-cron自动更新软件
  3. 你不知道的APP色彩跟产品场景的关联因素(干货多图)
  4. 用命令行CMD .bat 相关操作 如: 创建快捷方式 复制文件等
  5. CodeForces - 387D George and Interesting Graph(二分图最大匹配+暴力)
  6. mysql(slow-query) 快速开启慢日志查询的方法
  7. 如何在单个API中支持Java 6、8、9
  8. java显示星期几_Java 使用日历显示星期几
  9. 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求
  10. 飞鸽传书2011怎么用之启动常见问题(二)
  11. 用poi-3.6-20091214.jar 实现java给excel资料加密
  12. iOS开发之国际化(本地化)
  13. [EntLib]UAB(Updater Application Block)下载
  14. QQ空间美化高仿认证PS动态皮肤背景音乐添加快速聊天
  15. 小型企业有必要引进ERP系统?
  16. 计算机固态硬盘装系统,固态硬盘如何装系统
  17. 师资博后是个什么样的职位?
  18. 天翼云流量服务器,天翼云CDN常见问题解答
  19. 【AI测试】人工智能测试整体介绍——第六部分
  20. 学习C语言的网站(中文的英文的都有)

热门文章

  1. 2022-2028年中国操作系统行业深度调研及投资前景预测报告
  2. Python 标准库之 uuid
  3. QT学习之状态机框架
  4. 【Sql Server】DateBase-子查询
  5. visual2017中给C#项目添加配置文件
  6. 如何在CPU上优化GEMM矩阵乘法
  7. 如何在 CPU 上优化 GEMM
  8. TensorFlow创建DeepDream网络
  9. 满足实时人工智能的计算需求
  10. PyTorch神经网络集成技术