Comment transformer la sortie du réseau de neurones et toujours en train?

0

La question

J'ai un réseau de neurones dont les résultats output. Je veux transformer output avant la perte et backpropogation arriver.

Voici mon code:

with torch.set_grad_enabled(training):
                  outputs = net(x_batch[:, 0], x_batch[:, 1]) # the prediction of the NN
                  # My issue is here:
                  outputs = transform_torch(outputs)
                  loss = my_loss(outputs, y_batch)

                  if training:
                      scheduler.step()
                      loss.backward()
                      optimizer.step()

J'ai une fonction de transformation qui j'ai mis ma sortie par le biais de:

def transform_torch(predictions):
    torch_dimensions = predictions.size()
    torch_grad = predictions.grad_fn
    cuda0 = torch.device('cuda:0')
    new_tensor = torch.ones(torch_dimensions, dtype=torch.float64, device=cuda0, requires_grad=True)
    for i in range(int(len(predictions))):
      a = predictions[i]
      # with torch.no_grad(): # Note: no training happens if this line is kept in
      new_tensor[i] = torch.flip(torch.cumsum(torch.flip(a, dims = [0]), dim = 0), dims = [0])
    return new_tensor

Mon problème est que j'obtiens une erreur sur le côté de la dernière ligne:

RuntimeError: a view of a leaf Variable that requires grad is being used in an in-place operation.

Toutes les suggestions? J'ai déjà essayé d'utiliser "avec la torche.no_grad():" (en commentaire), mais cela entraîne une très mauvaise formation et je crois que les gradients de ne pas backpropogate correctement après la transformation de la fonction.

Merci!

1

La meilleure réponse

1

L'erreur est tout à fait correct sur ce qu'est la question - quand vous créez un nouveau tenseur avec requires_grad = True, vous créez une feuille de nœud dans le graphe (tout comme les paramètres d'un modèle) et ne sont pas autorisées à le faire en place à l'opération.

La solution est simple, vous n'avez pas besoin de créer de l' new_tensor à l'avance. Il n'est pas censé être un nœud feuille; il suffit de le créer à la volée

new_tensor = [ ]
for i in range(int(len(predictions))):
    a = predictions[i]
    new_tensor.append(torch.flip(torch.cumsum(torch.flip(a, ...), ...), ...))

new_tensor = torch.stack(new_tensor, 0)    

Cette new_tensor va hériter de tous les biens comme dtype, device à partir de predictions et aura require_grad = True déjà.

2021-11-20 04:18:52

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................