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.

Error: El tipo de entrada (torch.FloatTensor) y el tipo de peso (torch.cuda.FloatTensor) deben ser iguales.

Estoy intentando entrenar un modelo DNN usando Pytorch y quiero usar una GPU para entrenar. Puedo copiar exitosamente mi modelo a la GPU usando model.to(device), donde device = cuda:0.

Sin embargo, los métodos estándar para copiar la entrada a la GPU, (https://stackoverflow.com/q/59013109), es decir, X.to(device) y X.cuda(), no me dan la salida deseada. A continuación se presenta el método que estoy implementando actualmente:

def train_loop(self, dataloader, device):
    size = len(dataloader.dataset)
    for batch, (X, y) in enumerate(dataloader):
        # Compute prediction and loss
        print(device)
        X.to(device)
        print(X.is_cuda)
        y.to(device)

        pred = self.model(X)
        loss = self.loss_fn(pred, y)

Al imprimir el valor del dispositivo print(device), se muestra como: cuda:0. Pero cuando ejecuto print(X.is_cuda) devuelve false (captura de pantalla adjunta abajo).

Mensaje de error

Por favor, háganme saber dónde me estoy equivocando. ¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema es que X.to(device) no modifica X, sino que devuelve un nuevo tensor que ha sido copiado al dispositivo especificado. Así que cuando llames a X.to(device) en tu código, debes asignar el resultado de vuelta a X de esta manera:

    X = X.to(device)
    

    Lo mismo sucede con y.to(device).

    Tu método actualizado train_loop debería verse así:

    def train_loop(self, dataloader, device):
        size = len(dataloader.dataset)
        for batch, (X, y) in enumerate(dataloader):
            # Compute prediction and loss
            print(device)
            X = X.to(device)
            print(X.is_cuda)
            y = y.to(device)
    
            pred = self.model(X)
            loss = self.loss_fn(pred, y)
    

    Esto debería asegurarte de que los datos de entrada se copien correctamente a la GPU para el entrenamiento.

Comments are closed.