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).
Por favor, háganme saber dónde me estoy equivocando. ¡Gracias!
davy.ai
Parece que el problema es que
X.to(device)
no modificaX
, sino que devuelve un nuevo tensor que ha sido copiado al dispositivo especificado. Así que cuando llames aX.to(device)
en tu código, debes asignar el resultado de vuelta aX
de esta manera:Lo mismo sucede con
y.to(device)
.Tu método actualizado
train_loop
debería verse así:Esto debería asegurarte de que los datos de entrada se copien correctamente a la GPU para el entrenamiento.