es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo transformar la salida de una red neuronal y seguir entrenando?

Tengo una red neuronal que produce output. Quiero transformar output antes de que ocurra la pérdida y el retropropagación.

Aquí está mi código general:

with torch.set_grad_enabled(entrenando):
    outputs = net(xbatch[:, 0], xbatch[:, 1]) # la predicción de la NN
    # Mi problema está aquí:
    outputs = transformar(torch(outputs)
    pérdida = mi_loss(outputs, y_batch)

si está entrenando:
    scheduler.step()
    pérdida.backward()
    optimizer.step()

Tengo una función de transformación a la cual le introduzco mi salida:

def transformar_torch(predicciones):
    dimensiones_torch = predicciones.size()
    grad_torch = predicciones.grad_fn
    cuda0 = torch.device(‘cuda:0’)
    nuevo_tensor = torch.ones(dimensiones_torch, dtype=torch.float64, device=cuda0, requires_grad=True)
    for i in range(int(len(predicciones))):
      a = predicciones[i]
      
      nuevo_tensor[i] = torch.flip(torch.cumsum(torch.flip(a, dims=[0]), dim=0), dims=[0])
    return nuevo_tensor

Mi problema es que obtengo un error en la penúltima línea:

RuntimeError: se está utilizando una vista de una Variable de hoja que requiere gradiente en una operación in situ.

¿Alguna sugerencia? Ya he intentado usar “with torch.no_grad(): ” (comentado), pero esto resulta en un entrenamiento muy pobre y creo que los gradientes no retropropagan correctamente después de la función de transformación.

¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema es que intenta modificar un tensor que requiere el cálculo de gradiente en una operación en el lugar dentro de la función de transformación, lo que no está permitido en PyTorch, ya que puede romper el gráfico de computación y los gradientes pueden no calcularse correctamente.

    Una posible solución sería clonar el tensor antes de modificarlo, de modo que el tensor original no requiera el cálculo de gradiente y se preserve el gráfico de computación.

    Aquí hay una versión actualizada de la función de transformación con la operación de clonación agregada:

    def transform_torch(predictions):
        torch_dimensions = predictions.size()
        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():
            new_a = torch.flip(torch.cumsum(torch.flip(a.clone(), dims = [0]), dim = 0), dims = [0])
          new_tensor[i] = new_a
        return new_tensor
    

    Al clonar el tensor a antes de modificarlo mediante la operación a.clone(), creamos un nuevo tensor que no requiere el cálculo de gradiente y es seguro para modificar.

Comments are closed.