python - PyTorch 梯度计算所需的变量之一已通过就地操作进行了修改
问题描述
我在 PyTorch 中做一个策略梯度方法。我想将网络更新移动到循环中,但它停止了工作。如果解释很明显,我仍然是 PyTorch 新手,很抱歉。
这是有效的原始代码:
self.policy.optimizer.zero_grad()
G = T.tensor(G, dtype=T.float).to(self.policy.device)
loss = 0
for g, logprob in zip(G, self.action_memory):
loss += -g * logprob
loss.backward()
self.policy.optimizer.step()
更改后:
G = T.tensor(G, dtype=T.float).to(self.policy.device)
loss = 0
for g, logprob in zip(G, self.action_memory):
loss = -g * logprob
self.policy.optimizer.zero_grad()
loss.backward()
self.policy.optimizer.step()
我得到错误:
File "g:\VScode_projects\pytorch_shenanigans\policy_gradient.py", line 86, in learn
loss.backward()
File "G:\Anaconda3\envs\pytorch_env\lib\site-packages\torch\tensor.py", line 185, in backward
torch.autograd.backward(self, gradient, retain_graph, create_graph)
File "G:\Anaconda3\envs\pytorch_env\lib\site-packages\torch\autograd\__init__.py", line 127, in backward
allow_unreachable=True) # allow_unreachable flag
RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [128, 4]], which is output 0 of TBackward, 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).
我读到这个 RuntimeError 通常与必须克隆某些东西有关,因为我们使用相同的张量来计算自身,但我无法对我的情况下的问题做出正面判断。
解决方案
在您的情况下,这条线loss += -g * logprob
是错误的。
将其更改为:
loss = loss + (-g * logprob)
是的,它们是不同的。它们执行相同的操作,但方式不同。
推荐阅读
- html - 如何使用 CSS 组合器?
- python - 每次收到消息时创建通知实例并保存到数据库 Django Channels
- keras - simpleRNN 输入/输出形状
- c - 使用数组计算第二个人的最终结果时出错
- html - 我可以防止在网页上加载整个图像吗?
- python - TensorFlow:使用 boolean_mask 有效计算 sqrt
- javascript - Javascript:从嵌套函数调用外部方法
- cplex - 如何改造和变换矩阵?
- r - 如何将 direct.label() 与简单(两个变量)ggplot2 图表一起使用
- node.js - 每次更改分支时如何避免 npm install ?