Haces una foto a tu gato y, si buscas “gato” en la galería del móvil, muchas veces la encuentra. Pero un ordenador no ve gatos: lo único que sabe hacer es sumar y multiplicar números, muy deprisa.
La pregunta tonta de esta lección es: ¿cómo convierte un ordenador una foto en números? Y, ya puestos, ¿qué hace con ellos? La respuesta cabe en tres ideas que suenan a examen, vector, producto escalar y matriz, y en una sola cuenta: multiplicar y sumar.
Elige tu carta: ♣ si empiezas de cero, ♦ si no te asusta una fórmula sencilla, ♠ si quieres la notación. Puedes cambiarla en cualquier momento.
Una foto es una lista de números
Novato
Una foto digital es como un mosaico: está hecha de cuadraditos de colores, los píxeles, tan pequeños que no se ven a simple vista. Cuando el ordenador abre una foto, guarda cada cuadradito como tres números: cuánto rojo, cuánto verde y cuánto azul tiene, cada uno de 0 a 255. Un rojo puro es (255, 0, 0); el blanco, (255, 255, 255), y el negro, (0, 0, 0).
Una foto de 4000 por 3000 cuadraditos tiene 12 millones de píxeles. Con tres números cada uno, son 36 millones de números puestos en fila.
A una lista de números en fila se le llama vector, y a cuántos números tiene, su dimensión. Para el ordenador, tu foto es un vector de dimensión 36 millones. Todo lo que hará con ella son cuentas con esa lista.
Intermedio
Un vector es una lista ordenada de números, sus componentes. Con dos componentes se dibuja como una flecha que sale del centro: v = (3, 2) es “3 a la derecha y 2 arriba”. Su longitud sale por Pitágoras: √(3² + 2²) = √13 ≈ 3,6 (OpenStax).
Una foto en gris de dos píxeles sería una flecha así, en un plano; con tres píxeles, una flecha en el espacio. Con más ya no se puede dibujar, pero las cuentas son las mismas: la longitud sigue siendo la raíz de la suma de los cuadrados. La dimensión es cuántos números tiene el vector.
En una foto en color cada píxel lleva tres números de 0 a 255, uno por canal (rojo, verde y azul), porque cada uno ocupa 8 bits (Pillow, una librería de imágenes de Python). Así que una foto abierta es una tabla de alto × ancho × 3 números. El fichero JPEG ocupa menos porque va comprimido, pero al abrirlo se descomprime en esa tabla. Para dársela a una red neuronal se pone toda en fila: 4000 × 3000 × 3 = 36 millones de números.
Técnico
| En ♦ decíamos | En ♠ se escribe |
|---|---|
| vector | x ∈ ℝⁿ, una lista de n números reales |
| componentes | x = (x₁, …, xₙ) |
| longitud | norma euclídea ‖x‖ = √(Σᵢ xᵢ²) |
| dimensión | dim ℝⁿ = n: los vectores de una base, e₁, …, eₙ |
| canal | C; en RGB, C = 3, enteros de 8 bits en {0, …, 255} |
| alto × ancho × 3 | tensor H × W × C (HWC); torchvision usa C × H × W |
| se pone toda en fila | aplanar (flatten): x ∈ ℝⁿ con n = H·W·C |
Una imagen RGB de 8 bits es un tensor de enteros en {0, …, 255}^(H×W×C) con C = 3: Pillow 13.0 describe el modo «RGB (3x8-bit pixels, true color)» y dice que «an 8-bit pixel has a range of 0-255». torchvision 0.29 lo convierte con ToTensor, de (H × W × C) en [0, 255] a un tensor de coma flotante de forma (C × H × W) en [0,0, 1,0]. Aplanado, es un vector de ℝⁿ con n = H·W·C; para 4000 × 3000, n = 3,6×10⁷.
La dimensión de un espacio es el número de vectores de cualquier base (Austin, Understanding Linear Algebra, def. 3.5.6). La base canónica e₁, …, eₙ tiene n vectores, así que dim ℝⁿ = n: el número de componentes. La norma ‖x‖ = √(Σᵢ xᵢ²) es Pitágoras en n dimensiones.
El producto escalar: multiplicar y sumar
Novato
Un frutero vende en un día 30 manzanas, 12 plátanos y 18 naranjas, a 0,50 €, 0,25 € y 1 € cada una. ¿Cuánto ha ganado? Multiplicas cada cantidad por su precio y sumas: 15 + 3 + 18 = 36 €. Ese “multiplica uno a uno y suma” de dos listas es el producto escalar, y es la cuenta que más hace un ordenador con una foto. El ejemplo es de un libro de matemáticas, OpenStax.
Con flechas, el producto escalar dice otra cosa: cuánto apuntan hacia el mismo lado. Si empujas un carrito en diagonal, solo cuenta la parte del empuje que va hacia donde avanza. Si dos flechas van hacia el mismo lado, el producto escalar sale positivo; si se cruzan en ángulo recto, cero, y si van en sentidos opuestos, negativo.
Intermedio
El producto escalar de a = (a₁, a₂) y b = (b₁, b₂) es a·b = a₁b₁ + a₂b₂: se multiplican las componentes una a una y se suman (OpenStax). Con más componentes, igual. Con a = (3, 1) y b = (1, 2): 3·1 + 1·2 = 5. Con dos fotos de 36 millones de números, son 36 millones de multiplicaciones.
Con flechas tiene otra lectura: a·b = longitud de a × longitud de b × coseno del ángulo que forman (OpenStax). El coseno vale 1 si apuntan igual, 0 si forman un ángulo recto y −1 si son opuestas. Por eso dos flechas perpendiculares dan 0.
Si divides el producto escalar entre las dos longitudes queda solo el coseno, que mide cuánto se parecen las direcciones: es la similitud coseno. Con fotos tiene una gracia. Si multiplicas todos los números de una foto por 1,2, la ves más clara: la flecha se alarga pero no gira, y su similitud con la original sigue siendo 1 (cálculo propio, mientras ningún número pase de 255).
Técnico
| En ♦ decíamos | En ♠ se escribe |
|---|---|
| producto escalar | a·b = Σᵢ aᵢbᵢ (también ⟨a, b⟩ o aᵀb) |
| 36 millones de multiplicaciones | coste O(n): n productos y n − 1 sumas |
| longitud de a × longitud de b × coseno del ángulo | a·b = ‖a‖‖b‖cos θ, con θ ∈ [0, π] |
| El coseno vale 1 si apuntan igual, 0 si forman un ángulo recto y −1 si son opuestas | −1 ≤ cos θ ≤ 1, es decir, |a·b| ≤ ‖a‖‖b‖ (Cauchy–Schwarz) |
| perpendiculares | ortogonales: a·b = 0 (a ⊥ b) |
| similitud coseno | cos θ = a·b / (‖a‖‖b‖) |
| la flecha se alarga pero no gira | cos(x, λx) = 1 para todo λ > 0 |
En ℝⁿ, a·b = Σᵢ aᵢbᵢ. OpenStax (Calculus Volume 3, 2.3) demuestra con la ley de los cosenos que a·b = ‖a‖‖b‖cos θ (teorema 2.4), y que dos vectores no nulos son ortogonales si y solo si a·b = 0 (teorema 2.5). En más de tres dimensiones se va al revés: el ángulo se define por cos θ = a·b / (‖a‖‖b‖), y la desigualdad de Cauchy–Schwarz, |a·b| ≤ ‖a‖‖b‖, asegura que ese cociente cae en [−1, 1].
PyTorch 2.14 calcula la similitud coseno con torch.nn.functional.cosine_similarity, que divide entre max(‖x₁‖‖x₂‖, ε) para no dividir entre cero. Como cos(x, λx) = 1 para λ > 0, la similitud coseno no distingue una foto de otra más clara o más oscura que solo multiplique sus valores. El coste es lineal: n productos y n − 1 sumas.
Multiplicar y sumar. No hay más. Con eso comparo precios, flechas y fotos, y aún me sobra tiempo para la siesta.
Prueba tú: dos flechas
Arrastra las puntas de las flechas, o muévelas con los deslizadores o con las flechas del teclado. Busca una posición en la que el producto escalar valga 0: las flechas quedarán en ángulo recto. La franja azul es la sombra de b sobre a: se alarga cuanto más apuntan hacia el mismo lado.
Una matriz mueve el plano
Novato
Ahora el frutero compara dos tiendas, cada una con sus precios. Escribe los precios en una tabla: una fila por tienda y una columna por fruta. Esa tabla es una matriz. Para saber cuánto pagaría en cada tienda, multiplica su lista de la compra por cada fila y suma: un producto escalar por tienda, todos de una vez.
Una matriz también puede mover dibujos. Imagina una cuadrícula pintada sobre una goma elástica: la matriz dice adónde va cada punto, como si estiraras o torcieras la goma, pero con dos reglas: las rectas siguen rectas y el centro no se mueve.
Los programas que giran o estiran una foto hacen cuentas de este tipo para decidir adónde va cada píxel. Y algunas matrices aplastan el dibujo entero en una línea: después ya no hay manera de recuperarlo.
Intermedio
Una matriz es una tabla rectangular de números; una de m filas y n columnas es de m × n (OpenStax). Multiplicar una matriz por un vector es hacer el producto escalar de cada fila con el vector. Con A = (2 1 / 0 1) y x = (1, 2), la primera fila da 2·1 + 1·2 = 4 y la segunda, 0·1 + 1·2 = 2, así que Ax = (4, 2).
Hay un truco para leerla: la primera columna es adónde va (1, 0) y la segunda, adónde va (0, 1) (Austin). En el ejemplo, (1, 0) va a (2, 0) y (0, 1) va a (1, 1): la matriz estira en horizontal y tuerce. Con eso sabes adónde va todo, porque cualquier punto es una mezcla de esos dos.
El cuadradito de lado 1 se convierte en un paralelogramo. Con la matriz (a b / c d), su área es ad − bc: en el ejemplo, 2·1 − 1·0 = 2, el doble (Austin). Si da 0, la matriz aplasta el plano entero en una recta: se pierde una dimensión y no hay vuelta atrás. (1 −1 / 2 −2) lo hace. Si da negativo, el dibujo sale como en un espejo.
Pillow lo usa así para girar o torcer una foto: para cada píxel nuevo, calcula con una matriz de qué punto de la original sale (más un desplazamiento).
Técnico
| En ♦ decíamos | En ♠ se escribe |
|---|---|
| matriz | A ∈ ℝ^(m×n), entradas aᵢⱼ (fila i, columna j) |
| cada fila | (Ax)ᵢ = Σⱼ aᵢⱼxⱼ = (fila i de A)·x |
| la primera columna es adónde va (1, 0) y la segunda, adónde va (0, 1) | A = [Ae₁ Ae₂]: la columna j es T(eⱼ) |
| cualquier punto es una mezcla de esos dos | linealidad: A(c₁e₁ + c₂e₂) = c₁Ae₁ + c₂Ae₂ |
| tuerce | cizalla (shear), por ejemplo (1 1 / 0 1) |
| ad − bc | det A, el área con signo del paralelogramo de las columnas |
| aplasta | det A = 0: A no es invertible; el rango baja y la imagen es una recta |
| como en un espejo | det A < 0: cambia la orientación |
| girar | rotación R(θ) = (cos θ −sin θ / sin θ cos θ) |
| de qué punto de la original sale | usa A⁻¹: recorre la salida y busca en la entrada |
| (más un desplazamiento) | transformación afín x ↦ Ax + t |
Una matriz A de m × n define T(x) = Ax de ℝⁿ en ℝᵐ, con (Ax)ᵢ = Σⱼ aᵢⱼxⱼ. Sus columnas son las imágenes de la base: A = [T(e₁) ⋯ T(eₙ)] (Austin, prop. 2.5.8). Como T es lineal, T(Σⱼ cⱼeⱼ) = Σⱼ cⱼT(eⱼ), y con las columnas se sabe todo.
En 2×2, la rotación de ángulo θ es (cos θ −sin θ / sin θ cos θ), y (1 1 / 0 1) es una cizalla (Austin, 2.6). det A = ad − bc es el área con signo del paralelogramo de las columnas (3.4), y A es invertible si y solo si det A ≠ 0 (prop. 3.4.12). Con det A = 0 baja el rango: la imagen Col(A) tiene dimensión rank A (prop. 3.5.12), y con (1 −1 / 2 −2) es una recta.
Pillow 13.0 (ImageTransform.AffineTransform) toma «the first two rows from the inverse of an affine transform matrix»: para cada píxel de salida (x, y), lee la entrada en (ax + by + c, dx + ey + f). Usa la inversa porque recorre la foto de salida, y el desplazamiento (c, f) hace la transformación afín, no lineal.
Prueba tú: deforma la cuadrícula
Mueve los cuatro números de la matriz o prueba los botones. La flecha roja es la primera columna, adónde va (1, 0); la azul, la segunda. Busca una matriz que aplaste la cuadrícula en una recta: el área se hará 0. Y mira qué le pasa a la F con el espejo.
Multiplicar matrices: el orden importa
Novato
Para vestirte, primero el calcetín y luego el zapato. Al revés no sale lo mismo. Con las matrices pasa igual: hacer un cambio y después otro equivale a una sola matriz, que se calcula multiplicando las dos, y el orden importa. Girar una foto y luego estirarla a lo ancho no da lo mismo que estirarla y luego girarla.
Y aquí está la respuesta a la pregunta del principio. Una red neuronal que reconoce gatos recibe la foto como un vector enorme y la multiplica por matrices, una tras otra, con algún paso más entre medias. Cada fila de esas matrices es como una lista de precios: su producto escalar con la foto da un número. Por cada foto, son millones de cuentas de multiplicar y sumar.
Por eso a la IA le vienen tan bien las tarjetas gráficas: están hechas para hacer muchísimas multiplicaciones a la vez.
Intermedio
Para multiplicar dos matrices, cada número del resultado es el producto escalar de una fila de la primera por una columna de la segunda (OpenStax). Solo se puede si la primera tiene tantas columnas como filas la segunda: una de m × k por una de k × n da una de m × n.
Aplicar primero B y luego A a un punto da lo mismo que aplicar de una vez la matriz AB. Ojo: se escribe al revés de como se hace (Austin). Y AB no suele ser igual que BA (OpenStax). Con R, girar 90°, y S, estirar al doble a lo ancho: girar y luego estirar es S·R = (0 −2 / 1 0), y estirar y luego girar es R·S = (0 −1 / 2 0).
Una capa de una red neuronal multiplica su entrada por una matriz de pesos (PyTorch). Una foto en gris de 100 × 100 son 10 000 números; una capa con 1000 salidas usa una matriz de 1000 × 10 000 y hace 10 millones de multiplicaciones por foto (cálculo propio). Entre capa y capa hay un paso que no es una multiplicación; la lección «¿Regresión logística o red neuronal?» cuenta qué es y qué gana una red con él.
Las tarjetas gráficas meten muchas fotos a la vez, una por columna, y así todo se vuelve una sola multiplicación de matrices enorme (NVIDIA).
Técnico
| En ♦ decíamos | En ♠ se escribe |
|---|---|
| multiplicar dos matrices | (AB)ᵢⱼ = Σₖ aᵢₖbₖⱼ |
| una fila de la primera por una columna de la segunda | (fila i de A)·(columna j de B) |
| una de m × k por una de k × n da una de m × n | (m×k)(k×n) → m×n: las dimensiones interiores coinciden |
| AB | composición: A(Bx) = (AB)x; si T ↦ A y S ↦ B, S∘T ↦ BA |
| AB no suele ser igual que BA | no conmutativa; sí asociativa: (AB)C = A(BC) |
| capa | capa lineal (nn.Linear): y = xAᵀ + b |
| pesos | A ∈ ℝ^(out×in), aprendida; b, el sesgo |
| 10 millones de multiplicaciones | out·in = 10³·10⁴ = 10⁷ multiplicaciones-suma (FMA) por foto |
| un paso que no es una multiplicación | activación no lineal σ; sin ella, A₂(A₁x) = (A₂A₁)x es una sola capa |
| muchas fotos a la vez | lote (batch) de N: un GEMM de (M×K)(K×N), 2·M·N·K FLOP |
(AB)ᵢⱼ = Σₖ aᵢₖbₖⱼ, definido si las dimensiones interiores coinciden (OpenStax, College Algebra 2e, 7.5). Es asociativo y distributivo, pero no conmutativo. Si T(x) = Ax y S(x) = Bx, S∘T tiene matriz BA (Austin, prop. 2.5.11): la que se aplica primero va a la derecha.
Cada una de las m·n entradas es un producto escalar de k términos: m·n·k multiplicaciones-suma (FMA), es decir, 2·m·n·k FLOP. NVIDIA lo cuenta igual en su guía de GEMM, donde cada entrada es «a dot-product of K-element vectors». Para la capa de 1000 × 10 000 con un lote de 64 fotos: 2 · 1000 · 64 · 10 000 = 1,28×10⁹ FLOP (cálculo propio).
PyTorch 2.14 escribe la capa lineal como y = xAᵀ + b, con un ejemplo por fila y el peso A de forma (out_features, in_features). Por el sesgo b es afín, no lineal. NVIDIA pone los pesos en A y las activaciones en B, un ejemplo por columna: es la misma cuenta traspuesta. Sin una σ no lineal entre capas, la asociatividad haría que varias capas seguidas fueran una sola.
Yo no veo gatos: veo 36 millones de números. Lo difícil es saber por qué matrices multiplicarlos.
Reto final
En tres frases
- Para un ordenador, una foto es una lista de números (tres por píxel, de 0 a 255): un vector, cuya dimensión es cuántos números tiene.
- El producto escalar multiplica dos listas término a término y suma: da un total, como en la cuenta del frutero, y dice cuánto apuntan hacia el mismo lado dos flechas (0 si son perpendiculares).
- Una matriz es una tabla que mueve cada punto del plano, y multiplicar matrices encadena esos cambios, con el orden importando: es la cuenta que una red neuronal hace millones de veces con cada foto.
Fuentes
- Vectores, longitud y producto escalar: OpenStax, Calculus Volume 3, 2.1 y 2.3 (el frutero, teoremas 2.4 y 2.5). Matrices y su producto: OpenStax, College Algebra 2e, 7.5.
- Transformaciones, determinante y dimensión: D. Austin, Understanding Linear Algebra, 2.2, 2.5, 2.6, 3.4 y 3.5.
- Píxeles y transformaciones de imágenes: Pillow 13.0, Concepts y
ImageTransform. De la foto al tensor: torchvision 0.29,ToTensor. - Redes neuronales: PyTorch 2.14,
nn.Linearycosine_similarity. NVIDIA, Matrix Multiplication Background y Linear/Fully-Connected Layers.
Cómo está hecha esta lección: investigada y redactada con ayuda de Claude a partir de las fuentes de arriba, consultadas el 17 de octubre de 2026. Las cifras sin enlace propio son cálculos a partir de sus definiciones. Los ejemplos (la foto de 4000 × 3000, las dos tiendas, la capa de 1000 salidas) son inventados. Los dibujos son propios.