Я пытаюсь обучить нейронную сеть скорости, используя обратное распространение во времени. Вперед моей сети:
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
, но Я не понимаю, как это исправить, Может у кого-нибудь есть идея?
Большое спасибо.