无法理解PyTorch代码中的原地操作?

3
我在PyTorch中使用LSTM进行学习的实现如下: https://gist.github.com/rahulbhadani/f1d64042cc5a80280755cac262aa48aa 然而,代码遇到了就地操作错误。
我的错误输出如下:
/home/ivory/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:10: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).
  # Remove the CWD from sys.path while we load stuff.
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-86-560ec78f2b64> in <module>
     27 linear = torch.nn.Linear(hidden_nums, output_dim)
     28 
---> 29 global_loss_list = global_training(lstm2)

<ipython-input-84-152890a3028c> in global_training(optimizee)
      3     adam_global_optimizer = torch.optim.Adam([{'params': optimizee.parameters()}, 
      4                                      {'params':linear.parameters()}], lr = 0.0001)
----> 5     _, global_loss_1 = learn2(LSTM_Optimizee, training_steps, retain_graph_flag=True, reset_theta=True)
      6 
      7     print(global_loss_1)

<ipython-input-83-0357a528b94d> in learn2(optimizee, unroll_train_steps, retain_graph_flag, reset_theta)
     43             # requires_grad=True. These are accumulated into x.grad for every
     44             # parameter x. In pseudo-code: x.grad += dloss/dx
---> 45             loss.backward(retain_graph = retain_graph_flag) #The default is False, when the optimized LSTM is set to True
     46 
     47             print('x.grad: {}'.format(x.grad))

~/anaconda3/lib/python3.7/site-packages/torch/tensor.py in backward(self, gradient, retain_graph, create_graph)
    116                 products. Defaults to ``False``.
    117         """
--> 118         torch.autograd.backward(self, gradient, retain_graph, create_graph)
    119 
    120     def register_hook(self, hook):

~/anaconda3/lib/python3.7/site-packages/torch/autograd/__init__.py in backward(tensors, grad_tensors, retain_graph, create_graph, grad_variables)
     91     Variable._execution_engine.run_backward(
     92         tensors, grad_tensors, retain_graph, create_graph,
---> 93         allow_unreachable=True)  # allow_unreachable flag
     94 
     95 

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.FloatTensor [1, 10]] is at version 1; expected version 0 instead. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).

我尝试追踪错误,但没有成功。如有任何帮助,将不胜感激。

谢谢。


你尝试启用异常检测了吗? - Sergii Dymchenko
是的,我尝试过了,但我无法弄清楚发生了什么。 - Astra Uvarova - Saturn's star
嗯,我一周前学习了pyTorch,所以我还需要适应它。与TensorFlow相比,有些事情有点不同。 - Astra Uvarova - Saturn's star
1个回答

1
我认为问题出在以下这一行:

global_loss_list.append(global_loss.detach_())

在PyTorch中进行原地操作的惯例是在函数名称末尾使用下划线(例如detach_)。我认为您不应该进行原地分离。换句话说,将detach_更改为detach

那么,这个答案解决了你的问题吗? - ndrwnaguib
感谢您的评论。我遵循了您的建议,意识到了一些要点:
  1. 我忘记在上面提供的GitHub代码片段中添加learn2()函数。所以我添加了它并更新了代码片段。
  2. 我尝试在本地运行更新后的代码,但仍然出现相同的错误,仍然不知道原因,但是当我在Google Colab上运行时,它可以完美运行。请参见Google Colab文件链接:https://colab.research.google.com/drive/1kjvdmaWpKr9PS-FTy-6lVw_j1sbQNs4Y
- Astra Uvarova - Saturn's star
我想知道这是否与Google Colab本身或他们正在使用的Pytorch版本有关,与我使用的版本不同。在我的系统中,它是1.2.0,在Google Colab中它是1.1.0。 - Astra Uvarova - Saturn's star
在您上一条评论中提到的@Andrew Naguib,它确实解决了我的问题,但仅限于Google Colab,而不是本地。 - Astra Uvarova - Saturn's star
需要更新Andrew答案中的链接,因为我更新了我的GitHub代码片段。 - Astra Uvarova - Saturn's star
我修复了。谢谢! - ndrwnaguib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接