Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 (debug笔记)

2024-09-08 09:32

本文主要是介绍Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 (debug笔记),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」

##一、 缘由及解决方法
把这个pytorch-ddpg|github搬到jupyter notebook上运行时,出现错误Nn criterions don’t compute the gradient w.r.t. targets error。注:我用的评价准则函数为nn.MSELoss(evalute, target)。所以给出的错误提示是:在该准则函数不计算目标值(期望值,也称为target , label)的梯度。这说明,当前的程序中target的tensor Variable的属性requires_grad=True(可以打印出来验证一下)。

问题解决方法:将target的requires_grad属性变为False,也即不需要求梯度。此处不能直接requires_grad=False。正确的做法是在criterions(evalute, target)之前调用target.detach()target.detach_()函数。这样程序就不会出现这个错误了。

解释:在我遇到问题的程序中,target值是由要更新参数的网络前向计算出来的(例如,Q-learning里的Q值的更新),而不是普通的给定的label(例如,有监督学习的标签值)。此时的target是tensor的Variable,属性requires_grad=True,也即由计算图输出的变量都是需要求梯度的。我们利用detach_()或detach()函数是将target从整个计算图中分离出来。从而使target的属性恢复requires_grad=False。

二、下而是我遇到错误的代码,以及更正,大家可以参考。

  • 定位pytorch-ddpg|github,定位到图中红色框中的文件,点击进入该文件页。

这里写图片描述

  • 继续定位如图,图中绿色框中的代码应改为绿色字体的代码。运行程序就没这个错误了。

注:也可以在注释#critic update的上一行添加 target_q_value.detach_()来达到将target从计算图中分离出来的目的,同样能解决问题。
这里写图片描述

三、完整的debug过程

  • 1 运行pytorch-ddpg|github的程序,出现这个错误。

  • 2 两大搜索引擎,各种搜。发现遇到这个问题的人也不少,我根据问题下面的回答一个个偿试,例如将requires_grad=False等 ,发现不能这么硬来,并且会出现另一个错误如下(此时解决方法其实已经在错误中给出来了,但是我愣是没仔细看,还是现在整理时发现的,所以jump to 3):
    这里写图片描述

  • 3 因为这个例子是在更新类似Q-learning的Q值函数时出现的,突然记起pytorch经典的例程中就是DQN|pytorch例程。我运行这个程序没有出现任何错误,于是我将pytorch-ddpg|github中的有关部分改成与DQN|pytorch例程一样。但是,发现还是有问题,我仔细查看,发现还是有一点点不一样的。下图中,红框是DQN对应的target,发现后面跟了一个不知道有什么作用的函数。于是我又搜索,找到介绍这个函数的一个博客pytorch: Variable detach 与 detach_|CSDN博客,然后就明白问题的原因了(第一部分的解释已经给出原因)。

这里写图片描述

##四、 总结
虽然,绕了一步,但是结局是好的——问题解决了。pytorch-ddpg|github是利用DDPG来训练倒立摆,连续的动作,连续的时间。解决错误后,程序就很正常的运行,结果贴一下:

  • 刚开始的训练情况
    这里写图片描述

  • 1000步的训练情况
    这里写图片描述

最后,希望大家不会有找这个错误解决方法的机会。

补充:此篇遇到pytorch中关键的两个属性:Variable.requries_grad, Variable.volatile,以及两个函数Variable.detach()Variable.detach_()

这篇关于Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 (debug笔记)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147735

相关文章

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus