pytorch中的detach和detach_
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的源码:

1 # detach 的源码
2 def detach(self):
3     result = NoGrad()(self)  # this is needed, because it merges version counters
4     result._grad_fn = None
5     return 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

能用来干啥
可以对部分网络求梯度。

如果我们有两个网络 , 两个关系是这样的 现在我们想用 来为B网络的参数来求梯度,但是又不想求A网络参数的梯度。我们可以这样:

# 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_ 都可以用。但是如果 你也想用 y

detach detach_ pytorch相关推荐

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

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

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

    参考:https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-autograd/#detachsource 当我们再训 ...

  3. 获取当前脚本目录路径问题汇总

    20211223 https://blog.csdn.net/qq_43178297/article/details/88053836 获取上一层目录 import osprint('***获取当前目 ...

  4. 深度学习网络模型可视化netron

    很多时候,复现人家工程的时候,需要了解人家的网络结构.但不同框架之间可视化网络层方法不一样,这样给研究人员造成了很大的困扰. 前段时间,发现了一个可视化模型结构的神奇:Netron 查看全文 http ...

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

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

  6. Pytorch的backward()相关理解

    Pytorch的backward()相关理解 最近一直在用pytorch做GAN相关的实验,pytorch 框架灵活易用,很适合学术界开展研究工作.  这两天遇到了一些模型参数寻优的问题,才发现自己对 ...

  7. PyTorch Python API详解大全(持续更新ing...)

    诸神缄默不语-个人CSDN博文目录 具体内容以官方文档为准. 最早更新时间:2021.4.23 最近更新时间:2023.1.9 文章目录 0. 常用入参及函数统一解释 1. torch 1.1 Ten ...

  8. Pytorch中的梯度知识总结

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

  9. 15个小时彻底搞懂NLP自然语言处理(2021最新版附赠课件笔记资料)【LP自然语言处理涉及到深度学习和神经网络的介绍、 Pytorch、 RNN自然语言处理】 笔记

    15个小时彻底搞懂NLP自然语言处理(2021最新版附赠课件笔记资料)[LP自然语言处理涉及到深度学习和神经网络的介绍. Pytorch. RNN自然语言处理] 笔记 教程与代码地址 P1 机器学习与 ...

最新文章

  1. python count()方法
  2. 神经网络为何成为学习算法的通用结构?
  3. Android 设置thumb图片大小
  4. XenApp增加输出画面的帧率,提高类视频应用体验
  5. 2018 “神策杯”高校算法大师赛 6 强诞生,【招人】进行时……
  6. zeppelin连接数据源_使用开放源代码合同(open-zeppelin)创建以太坊令牌
  7. 第一章 架构 1.4 编译 amp; 1.5总结
  8. 合肥一六八2021高考成绩查询,合肥高考成绩查询入口
  9. 服务器php 启动命令_php启动内置服务器
  10. error C2864 只有静态常量整型数据成员才可以在类中初始化
  11. jsp酒店客房预订系统带前端
  12. 360怎样修改wifi服务器,360路由器怎么重新设置? | 192路由网
  13. uiautomator xpath筛选父级通框架内子元素调用
  14. java接口与抽象类的异同
  15. CS5218 DP转HDMI 4K30HZ转换方案|DP++to HDMI(4k30)
  16. 这3款浏览器体积小,好用速度快,堪比夸克
  17. python抓取微博评论的图片_用Python语言爬虫抓取微博评论图文教程
  18. Codeforces Round #644 (Div. 3) F.Spy-string
  19. 统信软件宣布旗下深度社区全新规划 打造我国主导的全球桌面系统根社区
  20. 2007年世界顶级防火墙排名(附下载地址)

热门文章

  1. 使用Docker搭建svn服务器教程
  2. 2022-2028年成都餐饮业投资分析及前景预测报告
  3. pycharm波浪线检查去掉
  4. 卷积神经网络(CNN)张量(图像)的尺寸和参数计算(深度学习)
  5. CPU,GPU,Memory调度
  6. 用TVM在硬件平台上部署深度学习工作负载的端到端 IR 堆栈
  7. 机器学习PAL基本概念
  8. MLIR多级中间表示概述
  9. Servlet----ServletContext
  10. 2021年大数据Hadoop(二十二):MapReduce的自定义分组