Si trabajas con redes neuronales, tarde o temprano vas a mover datos entre NumPy y PyTorch, y vas a operar tensores como si fueran matrices de álgebra lineal. Aquí aprendes cómo hacer esa conversión en ambos sentidos y cómo ejecutar las operaciones que sostienen casi toda la inteligencia artificial moderna.
La idea es simple: prototipas con NumPy, mueves a PyTorch cuando quieres aprovechar la GPU y el autograd, y operas tensores con sumas, restas, multiplicaciones elemento a elemento o multiplicación de matrices. Vamos por partes.
¿Cómo convierto un tensor de PyTorch a NumPy y viceversa?
La conversión entre ambas librerías es directa y la vas a usar todo el tiempo cuando combines herramientas de visualización, preprocesamiento o despliegue.
Para pasar un tensor de PyTorch a un array de NumPy, llamas al método .numpy() sobre el tensor. Puedes confirmar el tipo con la función type() de Python y verás que el resultado es un numpy.ndarray.
Para el camino inverso, usas torch.from_numpy(vector). Si creas un vector de unos en NumPy con floats, al convertirlo obtendrás un tensor con dtype=torch.float64 de manera automática [01:00].
¿Qué hace torch.from_numpy? Convierte un array de NumPy en un tensor de PyTorch conservando el tipo de dato original, para que puedas operarlo con todas las funciones de la librería.
¿Por qué importa esta interoperabilidad?
Porque te permite prototipar rápido en NumPy y luego mover el modelo a PyTorch cuando necesites entrenarlo con gradientes o GPU. No tienes que reescribir el código desde cero.
¿Qué son las operaciones element-wise en tensores?
Las operaciones element-wise son aquellas donde cada elemento de un tensor opera con el elemento en la misma posición del otro tensor. Suma, resta, multiplicación y división entran en esta categoría [02:30].
Para que funcionen, ambos tensores deben tener la misma forma. Si defines un zeros_tensor y un ones_tensor de tamaño 3x4, puedes sumarlos, restarlos o multiplicarlos usando los símbolos +, - y * directamente, igual que en Python básico.
- Suma:
zeros_tensor + ones_tensor.
- Resta:
zeros_tensor - ones_tensor.
- Multiplicación elemento a elemento:
zeros_tensor * ones_tensor.
La lógica es la misma para todas: posición por posición, sin mezclar filas ni columnas.
¿Qué pasa si las formas no coinciden? El broadcasting
Aquí viene lo interesante. Si divides un tensor aleatorio de forma (4,) entre un tensor de unos de forma (3, 4), PyTorch no falla: extiende automáticamente el vector para que tenga la forma de la matriz. Eso se llama broadcasting.
El resultado tendrá los mismos valores repetidos en cada fila, porque el vector original se replicó tres veces para alinear las dimensiones.
¿Cuándo funciona el broadcasting en PyTorch? Cuando una de las dimensiones del tensor más pequeño coincide con la del tensor más grande, o cuando es 1. Si tienes un vector de tamaño 3 intentando operar contra una matriz 3x4, falla porque las columnas no coinciden.
Si cambias el vector aleatorio a tamaño 3 e intentas la misma división, obtendrás un error indicando que el tamaño del tensor debe coincidir con el tensor B (de tamaño 4) y no es un singleton de dimensión uno [05:40].
¿Cómo se hace la multiplicación de matrices en PyTorch?
Citando a Jeremy Howard, creador de Fast.ai: la inteligencia artificial no es más que muchas multiplicaciones de matrices. Matrices grandes, muchas operaciones, pero al final, eso.
La multiplicación de matrices no es element-wise. Es la operación clásica del álgebra lineal donde combinas filas con columnas. Para ejecutarla en PyTorch usas torch.matmul(matrix1, matrix2).
Si creas matrix1 de forma 2x3 y matrix2 de forma 3x2, ambas con valores aleatorios, no podrías sumarlas porque sus formas son distintas. Pero sí puedes multiplicarlas como matrices, y el resultado tendrá forma 2x2 [07:20].
- Forma de matrix1: 2x3.
- Forma de matrix2: 3x2.
- Forma del resultado: 2x2.
La regla es que el número de columnas de la primera matriz debe coincidir con el número de filas de la segunda. Verifica las dimensiones del resultado con .shape, siempre.
¿Por qué torch.matmul se llama así?
Porque matmul es la convención compartida con NumPy y significa matrix multiplication. Si ya conoces np.matmul, la sintaxis te resultará familiar.
Habilidades y conceptos que se quedan contigo
En este recorrido viste cómo crear tensores con torch.zeros, torch.ones y torch.rand, cómo inspeccionar su forma con .shape, y cómo decidir entre operaciones element-wise y multiplicación de matrices según el problema que estés resolviendo.
También entendiste por qué el broadcasting es útil pero no mágico: solo funciona cuando las dimensiones son compatibles. Y aprendiste que mover datos entre NumPy y PyTorch es cuestión de una sola línea.
Con esto cierras el primer módulo: hola mundo, manipulación de tensores, debugging, operaciones e interoperabilidad con NumPy. ¿Te sientes listo para entrenar tu primer modelo con PyTorch? Cuéntalo en los comentarios.