Loss.backward(), rete neurale

di il
1 risposte

Loss.backward(), rete neurale

 def update(self, predictions_tensor, Y_tensor):
     predictions = torch.autograd.Variable(predictions_tensor, requires_grad=True)
     Y = torch.autograd.Variable(Y_tensor)
     loss = self.criterion(predictions, Y)
     self.dqn.zero_grad()
     loss.backward()
     for name, param in self.dqn.named_parameters():
         if param.grad is not None:
             print("Gradient of {}: {}".format(name, param.grad))
     self.optimizer.step()
     for param in self.dqn.parameters():
      print(param.data)
     print("Loss:", loss)
     return loss

Ho scritto questa funzione per aggiornare la rete neurale all'intero di un algoritmo di q_learning. l'algoritmo non funzioa, noto che VisualStudio non colora “backward()” come se non riconoscesse il metodo e inoltre i pesi della rete non vengono aggiornate (forse per questo motivo visto che il gradiente è costantemente None).  Sapete qual è il problema?

1 Risposte

  • Re: Loss.backward(), rete neurale

    Il problema potrebbe essere che la variabile requires_grad nella riga predictions = torch.autograd.Variable(predictions_tensor, requires_grad=True) viene impostata a True, il che significa che le operazioni eseguite su questa variabile devono essere tracciate per il calcolo del gradiente. Tuttavia, se il tensore predictions_tensor è stato creato senza richiedere il calcolo del gradiente, la funzione backward() non potrebbe essere applicata ad esso.

    Puoi provare a impostare requires_grad=False nella riga sopra, e vedere se il problema persiste. In alternativa, puoi anche verificare se i tensore predictions_tensor e Y_tensor sono entrambi variabili torch.Tensor o se sono state convertite in oggetti numpy o altro tipo di variabili prima di passarle alla funzione.

    Inoltre, se i gradienti sono sempre None, potrebbe essere utile verificare che il modello sia impostato correttamente per il calcolo del gradiente. Ad esempio, verificare che tutti i parametri del modello abbiano requires_grad=True.

    def q_learning(self, num_episodes, max_steps):
        for i_episode in range(num_episodes):
            state = self.env.reset()
            for t in range(max_steps):
                self.memory.push(*self.optimize_model(*self.env.step(self.select_action(state)), state))
                if self.env.done:
                    break
                state = self.env.state
    
    
Devi accedere o registrarti per scrivere nel forum
1 risposte