Pytorch 遇到错误梯度计算所需的变量之一已通过就地操作进行修改

Pytorch 遇到错误梯度计算所需的变量之一已通过就地操作进行修改,pytorch,autograd,Pytorch,Autograd,我遇到了以下错误。这是一个不同的rnn结构。我已经实现了在图卷积中使用。问题在于,隐藏操作是就地更新的。但是,我必须在每个转发呼叫中更新它的值。我该怎么做?提前谢谢 RuntimeError Traceback (most recent call last) <ipython-input-110-b4425651d544> in <module>() 8 out = model(x[i]

我遇到了以下错误。这是一个不同的rnn结构。我已经实现了在图卷积中使用。问题在于,隐藏操作是就地更新的。但是,我必须在每个转发呼叫中更新它的值。我该怎么做?提前谢谢

    RuntimeError                              Traceback (most recent call last)
<ipython-input-110-b4425651d544> in <module>()
      8     out = model(x[i])
      9     loss = mael(out, x[i+1])
---> 10     loss.backward(retain_graph=True)
     11     optimizer.step()
     12     print(loss.item())

1 frames
/usr/local/lib/python3.6/dist-packages/torch/autograd/__init__.py in backward(tensors, grad_tensors, retain_graph, create_graph, grad_variables)
    130     Variable._execution_engine.run_backward(
    131         tensors, grad_tensors_, retain_graph, create_graph,
--> 132         allow_unreachable=True)  # allow_unreachable flag
    133 
    134 

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.FloatTensor [1, 100]], which is output 0 of SelectBackward, is at version 1; expected version 0 instead. Hint: the backtrace further above shows the operation that failed to compute its gradient. The variable in question was changed in there or anywhere later. Good luck!
class RNN(nn.Module):
    def __init__(self, input_dim, hidden_dim):
        super(RNN,self).__init__()
        self.input_dim = input_dim
        self.hidden_dim = hidden_dim 
        self.weight = Parameter(torch.rand(10,input_dim,hidden_dim, requires_grad=True))
        self.weight_h = Parameter(torch.rand(10,input_dim,hidden_dim, requires_grad=True))
        self.bias = Parameter(torch.rand(10,input_dim,hidden_dim, requires_grad=True))
        self.hidden = torch.rand(10,input_dim, hidden_dim)
        self.weight_2 = Parameter(torch.rand(10,input_dim,hidden_dim,requires_grad=True))
        self.weight_h_2 = Parameter(torch.rand(10,hidden_dim,hidden_dim, requires_grad=True))
        self.bias_2 = Parameter(torch.rand(10,input_dim,hidden_dim, requires_grad=True))
        self.tanh = Tanh()
        self.iteration = 0
        self.next_layer = False
        self.hidden_init = torch.rand(1,1)
    
    def set_hidden(self,x):
      y = self.tanh(mm(x, self.weight[self.iteration]) + mm(self.hidden_init, self.weight_h[self.iteration]) + self.bias[self.iteration])
      return y 
    def set_hidden_state_layer_2(self, x, hidden):
      y = self.tanh(mm(x, self.weight_2[self.iteration]) + mm(hidden, self.weight_h_2[self.iteration]) + self.bias_2[self.iteration])
      return y
    
    def forward(self, x):
      try:
        dim_1, dim_2, dim_3 = x.shape
      except:
        x = torch.unsqueeze(x,0)
      
      if self.iteration == 10:
        self.next_layer = True
        self.iteration = 0
      if self.next_layer:
        self.hidden[self.iteration] = self.set_hidden_state_layer_2(x, self.hidden[self.iteration].clone())
        self.iteration = self.iteration + 1
        return self.hidden[self.iteration - 1]
      else:
        hidden_init = torch.rand(1,1)
        self.hidden[self.iteration] = self.tanh(mm(x, self.weight[self.iteration]) + mm(self.hidden_init, self.weight_h[self.iteration]) + self.bias[self.iteration])
        self.iteration = self.iteration + 1
        return self.hidden[self.iteration - 1]


model = RNN(1,100)
mael = nn.L1Loss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
x = torch.rand(11,1)
x_2 = torch.rand(11,1)
for i in range(10):
    optimizer.zero_grad()
    out = model(x[i])
    loss = mael(out, x[i+1])
    loss.backward(retain_graph=True)
    optimizer.step()
    print(loss.item())