Python Data Science Program
📓 Abrir notebook en GitHub

Clase 128 — Capas convolucionales, filtros, feature maps

Parte: 2 — Deep Learning · Fuente: Géron, cap. 14 § Convolutional Layers. ⏱️ Duración estimada: 75 min.

🎯 Objetivo

Entender la operación de convolución 2D — un filtro K×K se desliza sobre la imagen produciendo un feature map —, los hiperparámetros (filters, kernel_size, strides, padding), por qué las CNN son parameter-efficient vs MLPs (sharing + locality + translation invariance) y cómo aprenden jerarquías visuales (bordes → texturas → partes → objetos).

📚 Resultados de aprendizaje

Al finalizar, el estudiante podrá:

🗺️ Temas

📖 Definiciones y características

📂 Dataset / recursos

🧪 Ejercicios

  1. Conv básica: Conv2D(8, 3, padding='same', activation='relu')(input_28x28x1). Verificar shape de salida: (batch, 28, 28, 8).
  2. Conteo parámetros: para Conv2D(32, kernel_size=5) aplicado a entrada (28, 28, 1), calcular params (5*5*1*32 + 32 = 832).
  3. Stride 2: Conv2D(32, 3, strides=2, padding='same')(x). Shape de salida: (batch, H/2, W/2, 32).
  4. Visualizar feature maps: entrenar una mini-CNN en MNIST; tomar las activaciones intermedias para una imagen y visualizar.
  5. Filtros aprendidos: visualizar model.layers[0].kernel.numpy() para los primeros filtros. Para CIFAR, suelen verse bordes/colores básicos.

📝 Homework verificable

Mini-CNN para Fashion-MNIST:

  1. Conv(32, 3) → MaxPool(2) → Conv(64, 3) → MaxPool(2) → Flatten → Dense(128) → Dense(10).
  2. Entrenar y reportar accuracy.
  3. Visualizar feature maps de la primera Conv para 3 imágenes test.
  4. Calcular # parámetros total y compararlo con un MLP equivalente en tamaño (Dense(128) → Dense(64) → Dense(10) sin Conv).

Criterio de aceptación: accuracy de la CNN ≥ 0.91 (mejor que MLP); # parámetros de la CNN ≪ MLP equivalente.

⚠️ Errores comunes

Síntoma / mensaje Causa y cómo arreglar
Input shape error expected ndim=4, got ndim=3 Olvidaste el canal: MNIST viene (60000, 28, 28), hace falta (60000, 28, 28, 1). Fix: x = x[..., np.newaxis] o x.reshape((-1, 28, 28, 1)).
Conv2D + Dense sin Flatten o GlobalAveragePooling2D en el medio Dense espera 2D. Fix: agregá Flatten() o GlobalAveragePooling2D() antes del primer Dense.
padding='valid' con muchas capas → shape se vuelve 0 Cada conv reduce. Fix: usar 'same' por default.
Stride alto pierde información strides=4 con kernel=3 salta píxeles. Fix: alternar conv (stride 1) + pool (stride 2).
Filtros aprendidos no se ven nada Inicialización mala o modelo no entrenado. Fix: entrenar al menos unas épocas, verificar accuracy.

❓ Preguntas frecuentes

❓ ¿Cuántos filtros?

Empieza chico y duplicá al profundizar. Patrón estándar: 32 → 64 → 128 → 256.

❓ ¿Kernel 3×3 o 5×5?

3×3 es default moderno (VGG, ResNet). Dos 3×3 apilados tienen el mismo receptive field que 5×5 con menos parámetros.

❓ ¿stride o MaxPool para downsampling?

Tradicionalmente MaxPool. ResNet moderno usa stride 2 en Convs y elimina pooling intermedio. Ambos funcionan.

❓ ¿Conv1D para series, Conv3D para video?

Sí. Conv1D para secuencias temporales (clase 121 WaveNet). Conv3D para video (T × H × W × C).

❓ ¿Convs vs Transformers en visión?

CNN domina en visión clásica (eficiente, buen prior espacial). ViT (Vision Transformer) supera con datasets muy grandes (>10M imágenes). ConvNeXt (2022) recuperó terreno para CNN. Ver clase 126.

🔗 Referencias

📥 Material descargable

➡️ Siguiente clase

Clase 129 — Pooling