Al final del módulo anterior entrenamos una red densa 784-128-64-10 que alcanzaba un ~97.7 % de acierto en MNIST, y cerramos con una advertencia: para conseguirlo tuvimos que aplanar cada imagen de 28×28 píxeles en un vector de 784 números, destruyendo toda la información sobre qué píxel estaba al lado de cuál. Con dígitos diminutos en blanco y negro nos lo pudimos permitir; con las fotos reales de productos que suben los vendedores de TecnoMarket, no. En esta lección veremos con números por qué las redes densas no escalan a imágenes realistas, y conoceremos la arquitectura que domina la visión por computador desde 2012: la red neuronal convolucional (CNN, Convolutional Neural Network). Entenderás sus tres ideas fundamentales, harás una convolución a mano con una matriz pequeña y verás la anatomía general de una CNN completa.

Contenido

  1. Por qué las redes densas fallan con imágenes
  2. Las tres ideas clave de las CNN
  3. La operación de convolución paso a paso
  4. Anatomía general de una CNN

Por qué las redes densas fallan con imágenes

El problema 1: explosión de parámetros

Recordemos el método de recuento de parámetros del módulo 2: una capa densa con n entradas y m neuronas tiene n × m pesos más m sesgos.

En MNIST, la imagen era de 28×28 píxeles en escala de grises:

  • Entrada aplanada: 28 × 28 = 784 valores.
  • Primera capa densa de 128 neuronas: 784 × 128 + 128 = 100 480 parámetros.

Manejable. Pero una foto de producto de TecnoMarket, incluso reducida al tamaño estándar que usan muchos modelos de visión, es de 224×224 píxeles y 3 canales de color (rojo, verde, azul):

  • Entrada aplanada: 224 × 224 × 3 = 150 528 valores.
  • Primera capa densa de 128 neuronas: 150 528 × 128 + 128 = 19 267 712 parámetros.

Más de 19 millones de parámetros solo en la primera capa, casi 200 veces más que en MNIST. Y 224×224 es una imagen pequeña: la foto de un frigorífico que sube un vendedor puede ser de 2000×1500 píxeles. Comprobémoslo con Python:

# Recuento de parámetros de la primera capa densa según el tamaño de imagen
tamanos = [
    ("MNIST 28x28x1", 28 * 28 * 1),
    ("Producto 224x224x3", 224 * 224 * 3),
    ("Foto vendedor 1024x768x3", 1024 * 768 * 3),
]

neuronas = 128
for nombre, entradas in tamanos:
    parametros = entradas * neuronas + neuronas
    print(f"{nombre:28s} -> entrada: {entradas:>9,} "
          f"-> 1a capa densa: {parametros:>13,} parametros")

Salida:

MNIST 28x28x1                -> entrada:       784 -> 1a capa densa:       100,480 parametros
Producto 224x224x3           -> entrada:   150,528 -> 1a capa densa:    19,267,712 parametros
Foto vendedor 1024x768x3     -> entrada: 2,359,296 -> 1a capa densa:   301,990,016 parametros

Con la foto de un vendedor, 302 millones de parámetros en una sola capa. Más parámetros significa más memoria, más cómputo, más datos necesarios para entrenar sin sobreajustar (recuerda el sobreajuste leve que ya detectamos en 02-05 con solo 100 000 parámetros) y más lentitud. Este camino no escala.

El problema 2: pérdida de la estructura espacial

El segundo problema es más sutil pero igual de grave. Al aplanar la imagen, el píxel (0, 0) y el píxel (0, 1) —vecinos inmediatos— acaban en las posiciones 0 y 1 del vector, pero el píxel (1, 0), que está justo debajo del primero, acaba en la posición 28 (o 224, o 1024...). La red densa no tiene ni idea de que esos píxeles eran vecinos: para ella el vector de entrada es una lista de números sin geometría.

Consecuencias prácticas para TecnoMarket:

  • Un borde vertical (el canto de un portátil) es un patrón local de píxeles vecinos; la red densa no puede explotarlo directamente.
  • Si el producto aparece desplazado 10 píxeles a la derecha en la foto, para la red densa es una entrada completamente distinta: tendría que reaprender el mismo patrón en cada posición posible.
  • Cada neurona de la primera capa mira todos los píxeles a la vez, cuando la mayoría de patrones útiles (bordes, esquinas, texturas) ocupan regiones diminutas.

Necesitamos una arquitectura que respete la estructura 2D de la imagen y que reconozca un patrón independientemente de dónde aparezca. Eso es exactamente lo que hace una CNN.

Las tres ideas clave de las CNN

Las CNN se apoyan en tres principios que atacan directamente los dos problemas anteriores.

  1. Conectividad local

En lugar de conectar cada neurona con todos los píxeles, cada neurona de una capa convolucional mira solo una ventana pequeña de la imagen (por ejemplo, 3×3 píxeles), llamada su campo receptivo. Es la misma lógica que usarías tú: para decidir si en una esquina de la foto hay un borde, no necesitas mirar la foto entera, solo esa esquina.

Volviendo a la analogía del comité de compras del módulo 1: en vez de un comité donde cada miembro lee el catálogo completo, ahora cada miembro se especializa en inspeccionar una pequeña zona del producto.

  1. Pesos compartidos

Aquí está el gran truco de eficiencia: la misma ventana de pesos (el filtro o kernel) se desliza por toda la imagen. Si un filtro de 3×3 ha aprendido a detectar bordes verticales, detectará bordes verticales en la esquina superior izquierda, en el centro y abajo a la derecha, con los mismos 9 pesos.

  • Un filtro 3×3 sobre una imagen en escala de grises: 9 pesos + 1 sesgo = 10 parámetros, sin importar si la imagen es de 28×28 o de 1024×768.
  • Compáralo con los 19 millones de la capa densa sobre la imagen 224×224×3.

Además, esto da a la red una propiedad valiosísima llamada equivarianza a la traslación: si el microondas se desplaza en la foto, su patrón de activación se desplaza con él, pero se sigue detectando. No hay que reaprender nada por posición.

  1. Jerarquía de características

En 01-01 definimos el deep learning como el aprendizaje de una jerarquía de representaciones, de lo simple a lo abstracto. Las CNN son la materialización más clara de esa idea. Al apilar capas convolucionales:

Nivel Qué detecta Ejemplo en una foto de producto
Primeras capas Bordes y colores Líneas verticales/horizontales, transiciones claro-oscuro
Capas intermedias Texturas y motivos Rejilla metálica, superficie de plástico, madera
Capas medias-altas Partes de objetos Una pantalla, un asa, un teclado, una puerta de frigorífico
Últimas capas Objetos completos "Esto es un portátil", "esto es una cafetera"

Cada capa combina las detecciones de la anterior: los bordes se combinan en texturas, las texturas en partes, las partes en objetos. Nadie programa esta jerarquía; emerge del entrenamiento, igual que en la red 3-8-1 de pedidos ficticios los pesos aprendieron solos qué combinaciones delataban un fraude.

La operación de convolución paso a paso

Veamos la mecánica exacta de cómo un filtro "se desliza" por una imagen. Trabajaremos con una imagen de juguete de 5×5 (imagina un recorte diminuto en escala de grises de una foto de producto, donde a la izquierda hay fondo oscuro y a la derecha el producto claro) y un filtro de 3×3.

Imagen de entrada (5×5):

0  0  1  1  1
0  0  1  1  1
0  0  1  1  1
0  0  1  1  1
0  0  1  1  1

Hay un borde vertical entre la columna de ceros (oscuro) y las columnas de unos (claro).

Filtro detector de bordes verticales (3×3):

 1  0 -1
 1  0 -1
 1  0 -1

Este filtro responde con fuerza cuando su mitad izquierda ve valores distintos que su mitad derecha, es decir, cuando hay una transición vertical. (Es una versión del clásico filtro de Prewitt; la gracia de las CNN es que estos valores no se diseñan a mano, sino que se aprenden por backpropagation como cualquier otro peso.)

El procedimiento: colocamos el filtro sobre la esquina superior izquierda de la imagen, multiplicamos cada peso por el píxel que tiene debajo, sumamos los 9 productos y anotamos el resultado. Luego deslizamos el filtro una posición a la derecha y repetimos; al llegar al final de la fila, bajamos una posición.

Posición (0,0), el filtro cubre las 3 primeras filas y columnas:

Ventana:        Filtro:         Productos:
0  0  1         1  0 -1         0  0 -1
0  0  1    ×    1  0 -1    =    0  0 -1
0  0  1         1  0 -1         0  0 -1

Suma = -3

Posición (0,1), deslizamos una columna:

Ventana:        Filtro:         Productos:
0  1  1         1  0 -1         0  0 -1
0  1  1    ×    1  0 -1    =    0  0 -1
0  1  1         1  0 -1         0  0 -1

Suma = -3

Posición (0,2):

Ventana:        Filtro:         Productos:
1  1  1         1  0 -1         1  0 -1
1  1  1    ×    1  0 -1    =    1  0 -1
1  1  1         1  0 -1         1  0 -1

Suma = 0

Como todas las filas de la imagen son iguales, el resultado se repite al bajar. El mapa de características (feature map) resultante es de 3×3 (un filtro 3×3 sobre una imagen 5×5 cabe en 3×3 posiciones; en 03-02 veremos la fórmula general y cómo controlar este tamaño):

-3 -3  0
-3 -3  0
-3 -3  0

Lectura: los valores grandes en magnitud (aquí -3) señalan dónde está el borde vertical; el 0 señala zona uniforme. El mapa de características es literalmente un "mapa de dónde aparece el patrón que busca este filtro". El signo depende de la orientación del contraste (oscuro→claro aquí); tras la convolución se aplica una activación como ReLU (02-02), y filtros con signos opuestos capturan cada orientación.

Verifiquémoslo con numpy:

import numpy as np

imagen = np.array([
    [0, 0, 1, 1, 1],
    [0, 0, 1, 1, 1],
    [0, 0, 1, 1, 1],
    [0, 0, 1, 1, 1],
    [0, 0, 1, 1, 1],
], dtype=float)

filtro = np.array([
    [1, 0, -1],
    [1, 0, -1],
    [1, 0, -1],
], dtype=float)

def convolucion2d(imagen, filtro):
    """Convolucion 'valida': el filtro solo se coloca donde cabe entero."""
    fi, ci = imagen.shape        # filas y columnas de la imagen
    ff, cf = filtro.shape        # filas y columnas del filtro
    salida = np.zeros((fi - ff + 1, ci - cf + 1))
    for i in range(salida.shape[0]):
        for j in range(salida.shape[1]):
            ventana = imagen[i:i + ff, j:j + cf]   # recorte 3x3 de la imagen
            salida[i, j] = np.sum(ventana * filtro)  # producto elemento a elemento y suma
    return salida

print(convolucion2d(imagen, filtro))

Salida:

[[-3. -3.  0.]
 [-3. -3.  0.]
 [-3. -3.  0.]]

Coincide con nuestro cálculo a mano. Fíjate en el bucle: es exactamente "colocar, multiplicar, sumar, deslizar". Toda capa convolucional, por grande que sea, hace esto mismo (de forma vectorizada y con muchos filtros a la vez).

Puntos clave que conviene fijar:

  • Un filtro = un detector de un patrón. Una capa convolucional real tiene muchos filtros (32, 64...), cada uno buscando un patrón distinto, y produce un mapa de características por filtro.
  • Los valores del filtro son pesos entrenables: la red los ajusta con la misma maquinaria de backpropagation y descenso de gradiente que ya dominas de 02-03 y 02-04.
  • Tras la suma se añade un sesgo y se aplica una activación (típicamente ReLU), igual que en una neurona densa. Una capa conv es, en el fondo, la neurona de siempre pero con conectividad local y pesos compartidos.

Anatomía general de una CNN

Una CNN completa alterna dos tipos de bloques: una etapa convolucional que extrae características cada vez más abstractas, y una etapa densa final que usa esas características para clasificar. Entre convoluciones se intercalan capas de pooling, que reducen el tamaño de los mapas (las estudiaremos a fondo en 03-02; por ahora basta con saber que "resumen" regiones para condensar la información).

flowchart LR
    A["Foto de producto<br/>224x224x3"] --> B["Conv + ReLU<br/>detecta bordes"]
    B --> C["Pooling<br/>reduce tamano"]
    C --> D["Conv + ReLU<br/>detecta texturas/partes"]
    D --> E["Pooling<br/>reduce tamano"]
    E --> F["Flatten<br/>aplanar"]
    F --> G["Densa + ReLU"]
    G --> H["Densa softmax<br/>categoria: portatil,<br/>cafetera, monitor..."]

Observa el orden de las ideas:

  1. Bloques conv + pooling (se repiten 2, 3 o muchas más veces): construyen la jerarquía bordes → texturas → partes → objetos, manteniendo la estructura espacial en todo momento.
  2. Flatten: solo cuando los mapas ya son pequeños y contienen características abstractas ("hay una pantalla", "hay teclas") aplanamos. Aplanar aquí ya no es un crimen: la posición exacta ya importa poco, lo que importa es qué se ha detectado.
  3. Capas densas finales: combinan esas detecciones para emitir la clasificación, exactamente como la red 784-128-64-10 de 02-05, pero recibiendo características con significado en vez de píxeles crudos.

Esta división del trabajo es la clave: la parte convolucional actúa como un extractor de características aprendido y la parte densa como el clasificador. Para el proyecto estrella de este módulo —clasificar automáticamente las fotos que suben los vendedores de TecnoMarket— esta será la plantilla mental; la técnica la iremos armando pieza a pieza en las próximas lecciones, y el proyecto guiado completo llegará en 07-01.

Errores Comunes y Consejos

  • Pensar que los filtros se diseñan a mano. El filtro de bordes verticales que usamos es ilustrativo; en una CNN real los valores de los filtros se inicializan al azar y se aprenden durante el entrenamiento. La red decide sola qué detectores le convienen.
  • Confundir el filtro con el mapa de características. El filtro son los pesos (lo que la red aprende); el mapa de características es la salida de aplicar ese filtro a una imagen concreta (cambia con cada imagen).
  • Creer que las CNN eliminan las capas densas. No: casi toda CNN de clasificación termina en capas densas. Las convoluciones extraen características; las densas clasifican.
  • Olvidar que la convolución es la misma neurona de siempre. Multiplicar por pesos, sumar, añadir sesgo, activar: es el perceptrón de 02-01 con dos restricciones inteligentes (localidad y pesos compartidos). Si backprop te quedó claro en 02-03, ya sabes cómo se entrena una CNN.
  • Consejo: cuando veas una arquitectura CNN nueva, pregúntate siempre "¿dónde acaba el extractor de características y dónde empieza el clasificador?". Esa lectura te servirá durante todo el curso, especialmente en transfer learning (05-03).

Ejercicios

Ejercicio 1: la factura de la capa densa

Los vendedores de TecnoMarket suben fotos que el sistema redimensiona a 128×128 en color (3 canales). Si conectáramos esa imagen aplanada a una primera capa densa de 256 neuronas, ¿cuántos parámetros tendría esa capa? ¿Y cuántos parámetros tiene un filtro convolucional de 5×5 aplicado a esa misma imagen en escala de grises (1 canal)? Calcula ambos a mano y compara.

Ejercicio 2: convolución a mano

Aplica a mano (y comprueba después con la función convolucion2d de la lección) el filtro detector de bordes horizontales sobre esta imagen 4×4, que tiene una franja clara arriba y oscura abajo:

Imagen:            Filtro:
1  1  1  1          1  1  1
1  1  1  1          0  0  0
0  0  0  0         -1 -1 -1
0  0  0  0

¿Qué tamaño tiene el mapa de características resultante? ¿En qué posiciones responde con más fuerza y por qué?

Ejercicio 3: clasificar las tres ideas

Para cada situación, indica cuál de las tres ideas clave de las CNN (conectividad local, pesos compartidos, jerarquía de características) la explica mejor:

  1. El mismo detector de "esquina metálica" funciona tanto si la tostadora sale centrada como en el borde de la foto.
  2. Una neurona de la primera capa solo procesa una zona de 3×3 píxeles.
  3. La capa 8 de la red responde ante "puertas de frigorífico" combinando detecciones de "borde recto", "superficie lisa" y "asa" de capas anteriores.

Soluciones

Ejercicio 1:

  • Capa densa: entrada = 128 × 128 × 3 = 49 152 valores. Parámetros = 49 152 × 256 + 256 = 12 583 168 (unos 12.6 millones).
  • Filtro conv 5×5 sobre 1 canal: 5 × 5 = 25 pesos + 1 sesgo = 26 parámetros.
  • Comparación: la capa densa necesita ~484 000 veces más parámetros que un filtro. Aunque una capa conv real use 32 o 64 filtros (26 × 64 = 1664 parámetros), la diferencia sigue siendo de cuatro órdenes de magnitud. Además, el número de parámetros del filtro no depende del tamaño de la imagen.

Ejercicio 2:

El mapa resultante es de (4−3+1) × (4−3+1) = 2×2. Calculando cada posición:

  • Posición (0,0): ventana = filas 0-2, columnas 0-2 → (1+1+1) + 0 − (0+0+0) = 3
  • Posición (0,1): igual estructura → 3
  • Posición (1,0): ventana = filas 1-3 → (1+1+1) + 0 − (0+0+0) = 3
  • Posición (1,1): → 3
3  3
3  3

Todas las posiciones responden con fuerza porque todas las ventanas 3×3 posibles contienen la transición claro→oscuro: la franja horizontal cruza la imagen entera, y con solo 4 filas, cualquier ventana de 3 filas la incluye. La fila superior del filtro cae sobre valores claros y la inferior sobre oscuros (o sobre la transición), y esa diferencia es justo lo que mide el filtro. En una imagen mayor, con zonas uniformes lejos del borde, veríamos ceros fuera de la franja y valores altos solo a lo largo del borde.

Ejercicio 3:

  1. Pesos compartidos: el mismo filtro se aplica en todas las posiciones, así que el patrón se detecta esté donde esté (equivarianza a la traslación).
  2. Conectividad local: el campo receptivo de la neurona es una ventana pequeña, no la imagen completa.
  3. Jerarquía de características: las capas profundas componen detecciones de capas anteriores para representar conceptos cada vez más abstractos.

Conclusión

Hemos cerrado el círculo que abrimos al final del módulo 2: las redes densas no escalan a imágenes reales porque explotan en parámetros (19 millones en una sola capa para una modesta foto de 224×224×3) y porque aplanar destruye la geometría de la imagen. Las CNN resuelven ambos problemas con tres ideas: conectividad local (cada neurona mira una ventana pequeña), pesos compartidos (el mismo filtro se desliza por toda la imagen, con solo decenas de parámetros) y jerarquía de características (bordes → texturas → partes → objetos, la "jerarquía de representaciones" de 01-01 hecha arquitectura). Has ejecutado la operación de convolución a mano y en numpy, y ya sabes leer la anatomía de una CNN: bloques conv+pooling que extraen características y capas densas que clasifican.

Pero hemos dejado cabos sueltos a propósito: ¿por qué el mapa de características salía de 3×3 y no de 5×5? ¿Se puede evitar que la imagen encoja? ¿Qué hace exactamente el pooling y cuántos parámetros tiene una capa convolucional con muchos filtros y canales de color? Todo eso —stride, padding, canales, fórmulas de tamaño y las capas Conv2D y MaxPooling2D de Keras— es el terreno de la siguiente lección: capas convolucionales y de pooling.

Curso de Deep Learning

Módulo 1: Introducción a Deep Learning

Módulo 2: Fundamentos de Redes Neuronales

Módulo 3: Redes Neuronales Convolucionales (CNN)

Módulo 4: Redes Neuronales Recurrentes (RNN)

Módulo 5: Técnicas Avanzadas en Deep Learning

Módulo 6: Herramientas y Frameworks

Módulo 7: Proyectos Prácticos

Módulo 8: Consideraciones Éticas y Futuro del Deep Learning

© Copyright 2026. Todos los derechos reservados