Dibuja un dígito y sigue la señal capa por capa: qué detecta cada filtro, cómo se calcula una convolución y qué características empujan la decisión final.
Red convolucional de 5,258 parámetros, entrenada desde cero con NumPy sobre MNIST. Exactitud en el set de prueba: 99.2%.
Usa el dedo o el mouse. Los trazos grandes y continuos funcionan mejor.
Dibuja aquí
Dibuja un dígito
El recorrido completo
Cada bloque muestra los mapas de características que produce esa capa con tu dibujo. El contorno cian marca el mapa más activo. Toca un bloque para ir a su explicación.
Primero las capas convolucionales extraen características (bordes, curvas, cruces). Después la capa densa las pesa para votar por un dígito. Pasa el cursor por un bloque para ver su línea de código.
Introducción: cómo aprende a ver una red convolucional
Seis ideas bastan para entender todo lo que pasa en esta página. Léelas una vez y luego baja a jugar con cada capa.
1. La neurona es una suma ponderada
Una neurona recibe números, multiplica cada uno por un peso, suma todo y agrega un sesgo. Después aplica una función de activación. Aquí usamos ReLU: deja pasar los valores positivos y convierte los negativos en cero.
z = Σi wi · xi + b a = ReLU(z) = max(0, z)
Sin esa no linealidad, apilar diez capas sería equivalente a una sola multiplicación de matrices. ReLU es lo que permite aprender fronteras de decisión complejas.
2. Por qué no basta una red densa
En una capa densa cada neurona se conecta con los 784 píxeles. Ignora que los píxeles vecinos están relacionados y tiene que aprender por separado un trazo arriba a la izquierda y el mismo trazo abajo a la derecha. Una sola capa de 32 neuronas ya necesita 25,120 parámetros.
3. Convolución: mirar local, compartir pesos
Una neurona convolucional solo mira una ventana pequeña, y todas las neuronas de un mismo mapa comparten los mismos pesos: el filtro. Así detecta su patrón en cualquier posición con muy pocos parámetros. Los 8 filtros de la primera capa usan 80 números en total.
La idea viene de la biología: Hubel y Wiesel descubrieron que las neuronas de la corteza visual responden a bordes con cierta orientación dentro de una zona pequeña del campo visual.
4. Una jerarquía de características
Cada capa construye sobre la anterior. La primera ve 3×3 píxeles y aprende bordes. La segunda, gracias al pooling, ya abarca 8×8 píxeles y combina bordes en curvas, esquinas y cruces. La capa densa junta todo para decidir.
Campo receptivo de cada neurona Conv 1: 3×3, Conv 2: 8×8 Pool 2: 10×10, Densa: 28×28
A mayor profundidad, más grande la zona que ve cada neurona y más abstracto lo que detecta. Es el mismo principio de las redes que reconocen rostros o tumores, solo que con muchas más capas.
5. De mapas a una decisión
El max pooling resume cada bloque de 2×2 con su valor más alto: reduce el tamaño y hace a la red tolerante a desplazamientos pequeños. Al final, la capa densa da una puntuación z a cada dígito y softmax las convierte en probabilidades que suman 1.
pd = ezd / Σk ezk
La exponencial exagera las diferencias: una puntuación apenas 3 puntos mayor que la segunda ya se lleva cerca del 95% de la probabilidad.
6. Cómo aprende: descenso por gradiente
Al inicio los pesos son aleatorios. Con cada imagen de entrenamiento la red predice, el error se mide con la entropía cruzada y la retropropagación (la regla de la cadena) calcula cuánto contribuyó cada peso. Cada peso se mueve un poco en la dirección que reduce el error.
L = −log py w ← w − η · ∂L/∂w
Esta red vio 120,000 imágenes (MNIST más copias rotadas, escaladas y desplazadas) durante 9 épocas con el optimizador Adam. Nadie le dijo qué es un borde: los filtros que ves abajo salieron solos del gradiente.
Esta arquitectura es una versión miniatura de LeNet-5, la red que Yann LeCun y su equipo publicaron en 1998 para leer dígitos escritos a mano, y que se usó para procesar cheques bancarios.
Capa por capa
Todo se recalcula en vivo con tu dibujo. Toca los mapas para elegir otra posición.
0. Entrada
Tu trazo se recorta, se escala a una caja de 20 píxeles y se centra por su centro de masa en un lienzo de 28×28, igual que las imágenes de MNIST. Cada píxel es un número entre 0 (vacío) y 1 (tinta).
La red no ve un "dibujo": ve una matriz de 784 números. Todo lo que sigue son sumas y multiplicaciones sobre esa matriz.
Entrada X, 28×28 valores entre 0 y 1
1. Convolución: filtros que recorren la imagen
Un filtro es una rejilla de 3×3 pesos aprendidos. Se coloca sobre cada posición de la imagen, multiplica sus 9 pesos por los 9 píxeles de abajo, suma todo y agrega un sesgo. El resultado se escribe en un nuevo mapa: el mapa de características.
Como el mismo filtro se usa en todas las posiciones, detecta su patrón en cualquier lugar del dígito. Los pesos cian premian tinta en esa celda y los rosas la castigan: así un filtro se vuelve un detector de bordes horizontales, verticales o diagonales.
for y inrange(26):for x inrange(26): parche = X[y:y+3, x:x+3] z = (parche * K).sum() + b A[y, x] = max(0, z)
Entrada con la ventana de 3×3
Mapa de características
Parche de X
⊙
Filtro K
=
Producto
2. Max pooling: quedarse con lo más fuerte
El mapa se divide en bloques de 2×2 y de cada bloque sobrevive solo el valor máximo. El mapa pasa de 26×26 a 13×13: cuatro veces menos números, y la red se vuelve tolerante a que el trazo se mueva uno o dos píxeles.
M[y, x] = max( A[2y : 2y+2, 2x : 2x+2] )
Sigue el filtro que elegiste en el paso 1. Toca cualquiera de los dos mapas para ver otro bloque.
Mapa de Conv 1 (26×26) con rejilla de 2×2
Después del pooling (13×13)
3. Segunda convolución: combinar características
Cada filtro de esta capa mira los 8 mapas anteriores a la vez: tiene 8 rejillas de 3×3, una por mapa (72 pesos). Suma lo que encuentra en cada uno. Ya no detecta bordes sueltos sino combinaciones: una curva que cierra, un cruce, el final de un trazo.
z[y,x] = Σc Σi,j K[c,i,j] · M1[c, y+i, x+j] + b
Por el pooling anterior, cada neurona de esta capa "ve" una zona de 8×8 píxeles del dibujo original. Arriba de cada filtro está el promedio de las zonas del set de prueba que más lo activan: es literalmente la característica que busca.
Zona del dibujo que ve esta neurona (8×8)
Mapa de características (11×11)
Aporte de cada mapa de entrada en la posición elegida
4. Segundo pooling y aplanado
Otro max pooling reduce cada uno de los 16 mapas a 5×5. Después se "aplanan": los 16×5×5 valores se ponen en fila para formar un solo vector de 400 números.
Esos 400 números son todo lo que la red sabe de tu dibujo en este punto: qué características aparecieron y aproximadamente dónde.
El vector aplanado: 400 columnas, una por valor
5. Capa densa y softmax: la votación
Cada dígito tiene 400 pesos, uno por valor del vector. Su puntuación z es la suma de peso × valor más un sesgo. Agrupando esos productos por filtro se ve qué características empujan a favor (cian) y cuáles en contra (rosa).
zd = Σk W[d, k] · v[k] + bd pd = ezd / Σk ezk
Aporte de cada filtro de Conv 2 a la puntuación del dígito elegido. Debajo, lo que busca cada filtro.