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

相关文章

Pytorch介绍与安装过程

《Pytorch介绍与安装过程》PyTorch因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究和开发的主流工具之一,本文给大家介绍Pyto... 目录1、Pytorch介绍1.1、核心理念1.2、核心组件与功能1.3、适用场景与优势总结1.4、优

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

pytorch之torch.flatten()和torch.nn.Flatten()的用法

《pytorch之torch.flatten()和torch.nn.Flatten()的用法》:本文主要介绍pytorch之torch.flatten()和torch.nn.Flatten()的用... 目录torch.flatten()和torch.nn.Flatten()的用法下面举例说明总结torch

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp