18 · Canales: imágenes RGB y convoluciones multi-filtro
Las imágenes reales tienen 3 canales (RGB) — cada filtro CNN es 3D (h × w × in_channels) y apilar muchos filtros construye la dimensión de profundidad de los mapas de características.
Las imágenes reales tienen 3 canales (RGB) — cada filtro conv es en realidad 3D (h × w × in_channels), y tienes muchos de esos filtros.
Sin esto:
El modelo mental de solo escala de grises se rompe cuando llegas a ImageNet o cualquier dataset de fotos reales.
Hasta ahora cada lección trató las imágenes como cuadrículas 2D de números. Las imágenes reales son tensores 3D: altura × anchura × canales. Para fotos a color estándar eso significa 3 canales — Rojo, Verde, Azul. El píxel en la posición (y, x) no es un único número sino una terna (R, G, B) que representa la intensidad de cada componente de color.
Esto tiene una consecuencia directa para los filtros CNN. En el caso de escala de grises, un filtro 3×3 tiene 9 pesos. Para una entrada RGB, el mismo filtro "3×3" es en realidad 3×3×3 = 27 pesos — un pequeño cubo que abarca toda la profundidad de la entrada. El filtro calcula un producto punto entre sus 27 pesos y el parche correspondiente de 3×3×3 de la entrada, produciendo un único valor de salida. El mapa de características de salida de un filtro así sigue siendo 2D.
Para producir múltiples mapas de características — detectando diferentes características en cada ubicación espacial — usas múltiples filtros. Si usas 32 filtros cada uno de tamaño 3×3×3, obtienes 32 mapas de características 2D separados, que luego se apilan en un tensor 3D de salida de forma (out_h, out_w, 32). Los 32 canales de salida son la "profundidad" del mapa de características, completamente análoga a los 3 canales de la imagen RGB de entrada.
Así que la forma general de una capa conv es:
- Entrada: (H, W, in_channels)
- Banco de filtros: (out_channels, kH, kW, in_channels)
- Salida: (out_H, out_W, out_channels)
Donde cada canal de salida es la respuesta de un filtro aprendido.
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Read-along de PyTorch: nn.Conv2d con entrada RGB — formas de pesos y forward pass
Un Conv2d con in_channels=64, out_channels=128, kernel_size=3 — ¿cuántos parámetros de peso tiene?
- Imagen RGB = tensor (H, W, 3); un filtro CNN es un cubo 3D (kH, kW, C_in) que produce un mapa de características 2D por filtro mediante un único producto punto en todos los canales.
- Forma del banco de filtros: (C_out, kH, kW, C_in) — C_out filtros cada uno abarcando C_in canales; forma de salida es (out_H, out_W, C_out).
- Conteo de parámetros: C_out × C_in × kH × kW pesos + C_out sesgos. Para (3→32, k=3): 864+32 = 896 en total.
- NumPy/PIL usa (H, W, C); PyTorch usa (C, H, W) — siempre transponer con `tensor.permute(2, 0, 1)` al cargar datos de imagen personalizados.
Cada clasificador de imágenes maneja RGB. Los modelos preentrenados en ImageNet (ResNet, VGG, EfficientNet) esperan todos entradas (3, 224, 224) normalizadas a aproximadamente media cero y varianza unitaria.
Si lo quitas: En el momento en que miras la forma de la primera capa de cualquier modelo de ImageNet — (64, 3, 7, 7) en ResNet-50 — es opaco sin entender que 3 es C_in y 64 es C_out. La forma de cada backbone preentrenado se vuelve ilegible.