BPTT: RuntimeError: элемент 0 тензоров не требует grad и не имеет grad_fn - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь обучить нейронную сеть скорости, используя обратное распространение во времени. Вперед моей сети:

def forward (self, step):

for n in range(1,self.N):
  grad = self.gradient(n, step-1)
  self.grad_matrix[n,step] = grad
  next_r = torch.relu(self.rate_matrix[n,step-1].clone() + (self.dt/self.tau[n])*grad)

  self.rate_matrix[n,step] = next_r

output, state = torch.tensor(self.rate_matrix[[1], step]), torch.tensor(self.rate_matrix[[0,2,3,4,5,6],step])
return output, state

, а градиент вычисляется по уравнению

def gradient (self, n , шаг):

  grad = self.s[n] - self.V0[n] - self.rate_matrix[n,step].clone()\
    + (self.r_max - self.rate_matrix[n,step].clone())*torch.dot(self.A_ex[n,:], self.rate_matrix[:,step].clone())\
    - torch.dot(self.A_in[n,:], self.rate_matrix[:,step].clone()) 

где A_ex и A_in - это вес, который необходимо обновить

Я пытаюсь обучить сеть с помощью этого алгоритма:

States = [ (Нет, init_state)]

outputs = []
targets = []


for i, target in enumerate(labels):
  print('Temps :',i+1)


  state = states[-1][1].detach()
  state.requires_grad = True
  output, new_state = self.rnn_step.forward(i)

  outputs.append(output.clone().detach())
  targets.append(target)

  while len(outputs) > self.k1:
    del outputs[0]
    del targets[0]

  states.append((state, new_state))


  while len(states) > self.k2:
    del states[0]

  if (i+1) % self.k1 == 0:
    print('Back Propagation time...')

    optimizer.zero_grad()

    for j in range(self.k2-1):
      if j < self.k1:

        loss = self.loss_module(outputs[-j-1], targets[-j-1])
        loss.backward(retain_graph = True)

      if states[-j-2][0] is None:
          break

      curr_grad = states[-j-1][0].grad

      # LE PROBLEME VIENT DE STATES

      states[-j-2][1].backward(curr_grad, retain_graph=self.retain_graph)


    optimizer.step()

    print('les poids au temps ', i+1, 'sont ', self.rnn_step.A_ex, self.rnn_step.A_in)
    self.weight.append([self.rnn_step.A_ex, self.rnn_step.A_in])

но когда я запустил его, я получил:

элемент 0 тензоров не требует grad и не имеет grad_fn

, но Я не понимаю, как это исправить, Может у кого-нибудь есть идея?

Большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...