Pytorch中Trying to backward through the graph a second time错误解决方案
一、项目代码运行过程中完整的错误如下:
RuntimeError: Trying to backward through the graph a second time (or directly access saved tensors after they have already been freed). Saved intermediate values of the graph are freed when you call .backward() or autograd.grad(). Specify retain_graph=True if you need to backward through the graph a second time or if you need to access saved tensors after calling backward.
二、错误内容翻译成中文就是:
运行错误:第二次尝试向后遍历图形(或在已释放的张量后直接访问已保存的张量)。调用时,图形的已保存中间值将被释放。向后()或自动标记。梯度()。如果需要再次向后浏览图形,或者如果需要在向后调用后访问保存的张量,请指定retain_graph=True。
三、根据错误提示,解决方案就是在反向传播的函数中设定“retain_graph=True”(默认为False),每次反向传播后暂时保留中间节点的梯度值,保存后重新运行项目代码。
Pytorch中one of the variables needed for gradient computation has been modified by an inplace operation错误一种解决方案
一、项目代码运行过程中完整的错误如下:
RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.FloatTensor [512, 2]], which is output 0 of AsStridedBackward0, is at version 2; expected version 1 instead. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).
二、错误内容翻译成中文就是:
运行错误:梯度计算所需的变量之一已被一个就地操作修改:[torch.FloatTensor[512,2]],它是AsstridedBackard0的输出0,处于版本2;应该是版本1。提示:使用torch启用异常检测以查找未能计算其梯度的操作。签名。设置_检测_异常(真)。
三、解决问题心路历程:错误核心意思就是说在计算梯度的时候检查出某个Variable有被一个 inplace操作修改导致反向传播无法顺利进行。博主通过阅读大量资料和其他博主与此类似相关问题基本上是需要去寻找用户自己代码中进行inplace操作的地方进行修改,断绝inplace操作。但是博主通过一行一行排除寻找自己报错的代码发现自己代码中在Relu和view使用了inpalce操作,博主马上进行修改但是并没有解决问题。这时博主进行代码训练块部分顺序重构,将训练模型放进epoch循环里面发现能够顺利运行,此逻辑问题出在如果训练模型在epoch外,那么训练模型运行一次后的结果永远不会再变化,因为在epoch循环之外,即使已经反向传播更新了权重参数,但是无法起到重新训练作用。然后博主又测试将Relu和view还原使用了inpalce操作发现依旧正常运行,因此给出现此问题的码友们提供一个思路就是若修改了自己代码中的inplace操作的代码依旧报错,可以试一下代码部分顺序重构,发现可能存在的逻辑问题。