Trabajar con tensores en PyTorch puede generar errores frustrantes si no se controlan tres factores fundamentales: la forma (shape), el tipo de dato (dtype) y el dispositivo (device) donde se ejecutan. Dominar estos tres aspectos es lo que separa a quien escribe código funcional de quien pasa horas buscando bugs invisibles.
¿Cómo verificar la forma y las dimensiones de un tensor?
Cada tensor tiene un atributo llamado shape que devuelve un objeto torch.Size con el tamaño de cada dimensión [0:42]. Por ejemplo, una matriz de dos por dos devuelve torch.Size([2, 2]), lo que indica dos dimensiones con dos elementos cada una. Un tensor más complejo como uno de forma cinco por dos por tres tendrá tres dimensiones, y shape lo refleja con claridad.
matriz.shape → devuelve las dimensiones y sus grados.
tensor.ndim → devuelve únicamente el número de dimensiones.
El atributo ndim es útil para confirmar rápidamente cuántas dimensiones tiene un tensor [1:23], aunque shape ofrece más información al mostrar también el tamaño de cada una.
¿Por qué el tipo de dato puede causar errores entre tensores?
Los tensores almacenan valores con un tipo específico. El atributo dtype permite consultarlo [1:47]. El tipo por defecto en PyTorch es torch.float32, el más utilizado y recomendado para la mayoría de operaciones.
¿Qué tipos de datos existen en PyTorch?
PyTorch ofrece una variedad considerable de tipos [2:08]:
torch.float32 (o torch.float): punto flotante de 32 bits, el default.
torch.float64 (o torch.double): punto flotante de 64 bits, mayor precisión.
torch.bool: valores booleanos, verdadero o falso.
torch.int8: enteros con signo (signed integers).
torch.uint8: enteros sin signo (unsigned integers), solo positivos.
Entre más bits tenga un tipo, mayor precisión numérica ofrece. Sin embargo, al trabajar con GPUs limitadas como las de Colab, conviene usar tipos con menos bits como float32 para equilibrar precisión y rendimiento [3:05].
¿Qué sucede al operar tensores con tipos distintos?
Cuando se suman dos tensores de tipos diferentes, PyTorch toma la decisión automáticamente y convierte el resultado al tipo más adecuado [4:20]. Por ejemplo, sumar una matriz float32 con una int64 produce un tensor float32. PyTorch es inteligente al elegir la representación más óptima.
Para cambiar el tipo manualmente se usa la función .to() [4:55]:
python
matriz_float = matriz_uint64.to(dtype=torch.float32)
Esta función es extremadamente versátil y aparece constantemente en cualquier proyecto con PyTorch.
¿Cómo mover tensores entre CPU y GPU con CUDA?
El device indica el hardware donde vive un tensor: puede ser CPU o GPU [5:40]. Dos tensores deben estar en el mismo dispositivo para poder operar entre ellos.
CUDA es la plataforma de computación de NVIDIA que permite aprovechar el poder de las GPUs para acelerar operaciones como la multiplicación de matrices, esenciales en machine learning [6:15]. Para verificar su disponibilidad se utiliza:
python
torch.cuda.is_available() # Devuelve True si hay GPU disponible
Una vez confirmada la disponibilidad [6:30], la función .to() permite mover un tensor entre dispositivos e incluso cambiar su tipo en una sola instrucción:
python
Mover a GPU
tensor_cuda = tensor.to(torch.device("cuda"))
Mover de vuelta a CPU y cambiar tipo simultáneamente
tensor_cpu = tensor_cuda.to("cpu", dtype=torch.float32)
Este doble cambio en un solo comando hace que .to() sea una de las funciones más prácticas de PyTorch [7:45].
¿Qué error aparece al operar tensores en dispositivos diferentes?
Si se intenta sumar un tensor en CUDA con otro en CPU, PyTorch lanza un error claro [8:40]: "expected all tensors to be on the same device". El mensaje indica que encontró al menos dos dispositivos distintos, por ejemplo cuda:0 y cpu. El número después de cuda identifica la GPU específica; si hubiera cinco GPUs, se numerarían del cero al cuatro.
Solo es posible operar cuando ambos tensores comparten el mismo dispositivo. Este error es uno de los más frecuentes al comenzar con PyTorch.
Mantener alineados la forma, el tipo y el dispositivo de tus tensores evita la mayoría de errores comunes. Si dominas la función .to() y los atributos shape, dtype y device, tendrás las herramientas necesarias para debuggear con confianza. ¿Cuál de estos tres factores te ha dado más problemas? Compártelo en los comentarios.