El mundo hecho de números
¿Cómo ve una máquina una imagen, un sonido o un texto?
Lección completa
Si quieres:
En la lección anterior, a cada correo le bastaron dos números. Pero ¿y una foto? Una foto no parece un número. Veamos cómo se convierte en números.
Sin voz: la lección avanza sola con subtítulos.
La voz de esta lección está en preparación: por ahora avanza sola con subtítulos.
Modo revisiónComentar este pasoTerminé la lección
Qué lograrás
- Explicar cómo una imagen, un sonido y un texto se convierten en listas de números que un modelo puede recibir.
- Calcular cuántos números tiene una imagen, en grises o en color, a partir de su tamaño.
- Predecir qué ocurre con los números de una imagen cuando se desenfoca, aunque a simple vista parezca igual.
Ideas clave
- Un modelo solo recibe números. Una imagen en grises es una tabla de brillos de 0 (negro) a 255 (blanco); en color son tres tablas, una por canal (rojo, verde, azul).
- Aplanar la tabla da un vector: una lista ordenada con una característica (feature) por píxel. Cada ejemplo llega al modelo como un vector o un tensor.
- Una imagen en color de alto × ancho píxeles tiene alto × ancho × 3 números. Una foto de 12 megapíxeles tiene unos 36 millones.
- El sonido se guarda midiendo la señal muchas veces por segundo (muestras). Si se mide demasiado pocas veces, la onda ya no se puede reconstruir y se pierde información que ningún modelo recupera después.
- El texto también se convierte en vectores. Un código por letra solo etiqueta; los vectores aprendidos hacen que lo cercano en números sea cercano en significado.
- Una imagen casi igual para ti puede ser un vector distinto para el modelo: un desenfoque suave cambia todos los números de la carita.
Lo que mucha gente cree
Creencia común La IA «ve» una foto como nosotros y reconoce lo que hay en ella por lo que ve.
Lo correcto Recibe una tabla de números (brillos o colores) y nada más: dentro del modelo no hay «foto». Reconocer es encontrar patrones en esos números, y los aprende de ejemplos.
Compruébalo
Cuatro preguntas. Sin nota ni cuenta: sirven para ver si la idea quedó.
Por dentroPara quien quiere las fórmulas y el código. No hace falta para seguir el curso.
De la imagen al vector
Una imagen en escala de grises es una matriz . Aplanarla, fila por fila, da el vector con
La carita de la lección tiene , así que tiene 64 componentes. Cada valor cabe en un byte: niveles. Antes de entrenar es habitual normalizar, .
La vecindad se pierde al aplanar: el píxel y el son vecinos en la imagen, pero sus posiciones en el vector difieren en (ocho, en la carita). Un modelo que trata cada componente como una medida independiente, como el de los correos de la lección 1 o una red totalmente conectada, no sabe cuáles píxeles son vecinos; las redes convolucionales (lección 11) sí lo aprovechan y reciben la imagen como matriz.
Color, canales y tensores
Una imagen en color es un tensor con valores. Una foto de 12 megapíxeles, por ejemplo de píxeles, tiene
es decir, unos 36 MB sin comprimir a un byte por valor. Los archivos como JPEG ocupan mucho menos, pero el modelo trabaja con los píxeles ya decodificados (o con una versión reducida: AlexNet, por ejemplo, redujo todas las imágenes de ImageNet a —reescalando el lado corto a 256 y recortando el centro—, o sea valores, unas 183 veces menos que la foto de 12 megapíxeles; la red recibía además recortes de valores; Krizhevsky et al., 2012). El orden de los ejes depende de la biblioteca: alto × ancho × canales, o canales × alto × ancho. En rigor, un número, un vector y una matriz también son tensores (de 0, 1 y 2 ejes).
En la lección, el gris de cada píxel sale de su color con la receta de luma de la recomendación ITU-R BT.601 (versión 7, 2011): , aplicada a valores ya corregidos con gamma. Con tres canales de 8 bits hay colores posibles.
Desenfoque: mezclar con los vecinos
El desenfoque de la lección mezcla cada píxel con el promedio de su ventana , en una proporción :
con en los niveles 0 a 4, y la ventana restringida a los vecinos que existen (9 píxeles en el interior, 6 en los bordes, 4 en las esquinas). Para el píxel de la fila 3, columna 3 (contando desde 1), los nueve valores son 146, 202, 255, 202, 0, 202, 202, 0 y 202, y su promedio es . Es un caso particular de convolución (lección 11). Medido sobre la carita (valores redondeados a enteros): en cada nivel de 1 a 4 cambian los 64 números, con un cambio medio de 15.0, 29.9, 44.9 y 59.9 niveles de gris (de 255), y el contraste (máximo menos mínimo) baja de 255 a 205, 175, 145 y 131.
Con la operación se puede deshacer en teoría (la matriz es invertible; con ya amplifica 40 veces el redondeo), pero con pierde información de verdad. La suma de una ventana es , con la matriz tridiagonal de unos, y tiene un vector nulo, : tres vecinos seguidos siempre suman cero. Por eso el desenfoque completo tiene rango , no 64, y desaparecen 15 direcciones. Ejemplo exacto: sumar a la columna 4 de la carita cambia seis píxeles y da otra imagen con el mismo desenfoque completo, número por número.
Sonido: muestreo
Una señal se guarda como , con muestras por segundo. Shannon (1949, teorema 1) lo enuncia así: si una función no tiene frecuencias por encima de , queda completamente determinada por sus valores en puntos separados segundos; en la práctica se pide para una señal sin frecuencias por encima de (en el límite exacto, , el tono de frecuencia no queda determinado, como se ve en la demostración). Shannon atribuye a Nyquist la importancia de ese intervalo. Whisper remuestrea todo el audio a Hz (Radford et al., 2022, sección 2.2), con lo que se representan componentes de hasta 8 kHz: un minuto son valores. El modelo no recibe esos valores tal cual: calcula un espectrograma logarítmico de 80 canales con ventanas de 25 ms y paso de 10 ms, es decir 100 columnas por segundo, números por segundo.
La señal de juguete de la lección suma un tono de 200 y otro de 500 ciclos por segundo y se repite cada 10 ms; se toman muestras por periodo. La línea discontinua es lo que reconstruiría un conversor ideal (interpolación trigonométrica de las muestras). Se comprobó con el código de la lección: con la reconstrucción coincide con la señal sin error; con el error relativo es 0.43 (el tono de 500 queda justo en el límite) y por debajo es aún mayor (de 0.67 a 1.65). Por eso la compuerta pide bajar a 1 000 o menos.
Texto: de códigos a vectores
Unicode asigna un número, el punto de código, a cada carácter: «N» es 78, «e» es 101, «u» es 117, «ñ» es 241 (tablas de códigos del estándar Unicode). Es una etiqueta, no un significado. Los modelos de lenguaje parten el texto en tokens (lección 20), cada token es un entero, y una tabla de embeddings entrega a cada uno un vector , aprendido durante el entrenamiento. En GPT-3 175B la dimensión del modelo es (Brown et al., 2020, tabla 2.1). Los cuatro rasgos de la lección () son inventados; en un modelo real los rasgos se aprenden y no tienen nombre. La cercanía en el espacio, medida por ejemplo con la distancia euclídea , se llena de significado en la lección 14. En la lección, «gato» y «perro» están a 0.22; «gato» y «tigre», a 1.08; «gato» y «pan», a 1.68.
MNIST (LeCun et al., 1998) parte de dígitos escritos por empleados de la Oficina del Censo de EE. UU. y por estudiantes de secundaria (bases NIST SD-3 y SD-1). Las imágenes originales eran en blanco y negro; al normalizarlas a una caja de píxeles aparecieron los grises, y se centraron en un cuadro de por el centro de masa. La imagen de la lección es una ilustración, no un dígito del conjunto.
En código
import numpy as np
# la carita en grises (8x8), la misma de la lección
carita = np.array([
[ 20, 20, 146, 146, 146, 146, 20, 20],
[ 20, 146, 202, 255, 202, 202, 146, 20],
[146, 202, 0, 202, 202, 0, 202, 146],
[146, 202, 0, 202, 202, 0, 202, 146],
[146, 202, 202, 202, 202, 202, 202, 146],
[146, 202, 0, 202, 202, 0, 202, 146],
[ 20, 146, 202, 0, 0, 202, 146, 20],
[ 20, 20, 146, 146, 146, 146, 20, 20],
], dtype=np.uint8)
vector = carita.flatten() # de tabla a lista, fila por fila
print(carita.shape, vector.shape) # (8, 8) (64,)
# un píxel y el de abajo: vecinos en la imagen, lejos en el vector
i, j = 2, 2
print(i * 8 + j, (i + 1) * 8 + j) # 18 26
# desenfoque de un píxel: promedio de su ventana 3x3
ventana = carita[i - 1:i + 2, j - 1:j + 2]
print(ventana.mean()) # 156.77777777777777
# desenfoque de toda la imagen (en los bordes, solo los vecinos que existen)
def desenfoque(img):
out = np.zeros(img.shape)
for r in range(8):
for c in range(8):
out[r, c] = img[max(r - 1, 0):r + 2, max(c - 1, 0):c + 2].mean()
return out
x = carita.astype(float)
otra = x.copy()
otra[:, 3] += [25, -25, 0, 25, -25, 0, 25, -25] # otra imagen: seis píxeles distintos
print(int((otra != x).sum()), np.abs(desenfoque(x) - desenfoque(otra)).max()) # 6 0.0
# desenfoque suave (25 %): todos los números cambian, pero poco
suave = 0.75 * x + 0.25 * desenfoque(x)
print(round(np.abs(suave - x).mean(), 1), int((np.round(suave) != x).sum())) # 15.0 64
# una foto de 12 megapíxeles en color (4000 x 3000 píxeles, 3 canales)
foto = np.zeros((3000, 4000, 3), dtype=np.uint8)
print(foto.shape, foto.size) # (3000, 4000, 3) 36000000
# texto: el código de cada letra
print([ord(c) for c in "Neu"]) # [78, 101, 117]
Lo que viene
Con los datos ya en vectores, la lección 3 pone el primer modelo encima: una recta y su error. Más adelante, las convoluciones (lección 11) recuperan la vecindad de los píxeles, los embeddings (lección 14) dan geometría al significado y los tokens (lección 20) explican qué «piezas» de texto lee de verdad un modelo de lenguaje.
Lente de decisión
Qué significa esta idea si tu trabajo es decidir, no programar.
- Lo que un modelo puede aprender tiene un techo: lo que sobrevive en los números. Resolución, compresión, frecuencia de muestreo y calidad de la transcripción fijan ese techo, y ninguna IA recupera con certeza lo que no se midió (puede inventar algo plausible). Pregunta a qué calidad se captura lo que vas a usar.
- Más números por ejemplo significan más memoria y más cómputo. Una foto de 12 megapíxeles son unos 36 millones de valores, por eso los sistemas suelen reducir las imágenes antes de procesarlas (AlexNet las bajó a 256 × 256 en 2012). Pregunta qué versión ve realmente el modelo y cuánto detalle pierde.
- «Basura entra, basura sale»: otra cámara, otro micrófono o otro escáner producen números distintos aunque a ti te parezca lo mismo (como el desenfoque suave de la lección, que cambia los 64 números de la carita). Prueba el sistema con muestras de tu operación real, no solo con la demostración.
- Si con esos números se puede identificar a alguien, siguen siendo datos personales: el RGPD europeo (art. 4) llama datos personales a cualquier información sobre una persona identificable, y biométricos a los que resultan de procesar técnicamente sus rasgos físicos para identificarla, como las imágenes faciales. Trata la representación numérica con las mismas reglas de privacidad que el original.
Términos de la lección
- Píxel El punto más pequeño de una imagen digital. En escala de grises es un número de 0 (negro) a 255 (blanco); en color son tres números (rojo, verde y azul).
- Vector Lista ordenada de números. En aprendizaje automático, cada ejemplo llega al modelo como un vector.
- Característica (feature) Una medida de un ejemplo expresada como número: el número de enlaces de un correo, el brillo de un píxel. Las características de un ejemplo forman su vector.
- Tensor Arreglo de números con cualquier cantidad de ejes: un vector tiene uno, una matriz dos, una imagen en color tres (alto, ancho y canales).
- Datos de entrenamiento Ejemplos, cada uno con su respuesta correcta, con los que un modelo ajusta sus parámetros.
- Modelo Una forma de regla con números ajustables. Una vez entrenado, es la regla aprendida.
- Convolución Operación en la que un kernel pequeño recorre una imagen y, en cada posición, multiplica y suma píxeles por pesos para producir un píxel de salida.
- Embedding Vector de números, aprendido de los datos, que representa algo (una palabra, una frase, una imagen) de modo que lo parecido quede cerca. Cada palabra tiene una fila en una tabla de embeddings.
Transcripción completa
Fuentes
- LeCun, Y., Cortes, C., Burges, C. J. C. (1998). The MNIST database of handwritten digits (copia archivada de la página de LeCun, Cortes y Burges; la página en vivo ya solo lista los archivos)
- LeCun, Y., Bottou, L., Bengio, Y., Haffner, P. (1998). Gradient-based learning applied to document recognition (origen y tamaño de MNIST, sección III-A)
- Radford, A., Kim, J. W., Xu, T., Brockman, G., McLeavey, C., Sutskever, I. (2022). Robust Speech Recognition via Large-Scale Weak Supervision (Whisper), sección 2.2
- Shannon, C. E. (1949). Communication in the Presence of Noise (teorema 1: muestreo)
- Brown, T. B. et al. (2020). Language Models are Few-Shot Learners (GPT-3), tabla 2.1
- Krizhevsky, A., Sutskever, I., Hinton, G. E. (2012). ImageNet Classification with Deep Convolutional Neural Networks (AlexNet), sección 2: imágenes reducidas a 256 × 256
- ITU-R (Unión Internacional de Telecomunicaciones) (2011). Recommendation ITU-R BT.601-7: Studio encoding parameters of digital television for standard 4:3 and wide-screen 16:9 aspect ratios (la receta de luma del gris)
- The Unicode Consortium (2026). The Unicode Standard, Version 18.0: código de cada carácter (C0 Controls and Basic Latin)
- The Unicode Consortium (2026). The Unicode Standard, Version 18.0: código de «ñ» (C1 Controls and Latin-1 Supplement)
- Parlamento Europeo y Consejo de la UE (2016). Regulation (EU) 2016/679 (GDPR), art. 4: datos personales y datos biométricos
ComentariosConversación pública de esta lección: dudas, datos por revisar, ideas.
Los comentarios viven en GitHub Discussions, en el repositorio público del curso; para escribir se necesita una cuenta de GitHub. Se cargan desde giscus.app al abrir esta sección. Las personas que revisan el curso los leen, y si un cambio se acepta, se aplica en los dos idiomas. Abrir el hilo en GitHub