pytorch detach 与 detach_
pytorch 的 Variable 对象中有两个方法,detach和 detach_ 本文主要介绍这两个方法的效果和 能用这两个方法干什么。
detach
官方文档中,对这个方法是这么介绍的。
- 返回一个新的 从当前图中分离的 Variable。
- 返回的 Variable 永远不会需要梯度
- 如果 被 detach 的Variable volatile=True, 那么 detach 出来的 volatile 也为 True
- 还有一个注意事项,即:返回的 Variable 和 被 detach 的Variable 指向同一个 tensor
detach_
官网给的解释是:将 Variable 从创建它的 graph 中分离,把它作为叶子节点。
从源码中也可以看出这一点
- 将 Variable 的grad_fn 设置为 None,这样,BP 的时候,到这个 Variable 就找不到 它的 grad_fn,所以就不会再往后BP了。
- 将 requires_grad 设置为 False。这个感觉大可不必,但是既然源码中这么写了,如果有需要梯度的话可以再手动 将 requires_grad 设置为 true
能用来干啥
如果我们有两个网络 A,BA,B, 两个关系是这样的 y=A(x),z=B(y)y=A(x),z=B(y) 现在我们想用 z.backward()z.backward() 来为 BB 网络的参数来求梯度,但是又不想求 AA
在这种情况下,detach 和 detach_
都可以用。但是如果 你也想用 yy 来对 AA 进行 BP 呢?那就只能用第一种方法了。因为 第二种方法 已经将 AA