PDI+VC · Ejercicio de Programación

EP09_03 — 🟡 Conteo de Parámetros Entrenables de una CNN

9.10.3 EP09_03 🟡 Conteo de Parámetros Entrenables de una CNN

Este EP formaliza el conteo de parámetros entrenables de una CNN. Dada la descripción textual de una pequeña arquitectura, compuesta por capas convolucionales, de pooling y totalmente conectadas, determine, para cada capa, el número de parámetros entrenables y el total de la red.

La arquitectura debe interpretarse secuencialmente: la salida de una capa convolucional se convierte en la entrada de la siguiente capa compatible. Así, el número de canales producidos por una capa CONV determina el número de canales de entrada (cin) de la capa convolucional siguiente.

En una capa convolucional, es importante distinguir canales de entrada y canales de salida:

  • \(c_{in}\) (channels in) es el número de canales que entran en la capa. Una imagen en tonos de gris posee \(c_{in}=1\), mientras que una imagen RGB posee \(c_{in}=3\). En una capa convolucional intermedia, cin normalmente es igual al número de canales producidos por la capa CONV anterior.
  • \(c_{out}\) (channels out) es el número de canales producidos por la capa. Es igual al número de filtros utilizados. Por lo tanto, si una capa posee 16 filtros, produce \(c_{out}=16\) canales.

Por ejemplo, considere la secuencia:

CONV 3 3 1 8 1
POOL
CONV 3 3 8 16 1
POOL
FC 784 10 1

La primera convolución recibe una imagen con un canal y produce 8 canales. Después del pooling, la segunda convolución recibe esos 8 canales y produce 16 canales. La capa POOL no altera el número de canales, solo puede reducir las dimensiones espaciales. La capa FC recibe la cantidad de entradas informada en la propia descripción.

Cada filtro convolucional posee dimensiones

\[ k_h \times k_w \times c_{in}. \]

Así, una capa con \(c_{out}\) filtros posee

\[ k_h \cdot k_w \cdot c_{in} \cdot c_{out} \]

pesos. Si hay sesgo, se añade un parámetro para cada filtro, totalizando más \(c_{out}\) parámetros.

El punto central de este ejercicio es observar que la cantidad de parámetros de una capa convolucional no depende de las dimensiones espaciales (\(H \times W\)) del mapa de características. Esto ocurre debido al comparticionamiento de pesos: el mismo filtro se reutiliza en diferentes posiciones de la entrada.

9.10.3.1 📋 Directrices de Implementación

  1. Entrada: Leer el entero \(L\) (número de capas de la arquitectura, en el orden en que se aplican).

  2. Capas: Leer \(L\) líneas, cada una describiendo una capa en uno de los tres formatos:

    • CONV kh kw cin cout bias — capa convolucional con kernel \(k_h \times k_w\), \(c_{in}\) canales de entrada, \(c_{out}\) canales de salida y bias (0 o 1), indicando si hay sesgo por filtro;
    • POOL — capa de pooling (máximo o medio), que no posee parámetros entrenables y preserva el número de canales;
    • FC in out bias — capa totalmente conectada con in entradas, out salidas y bias (0 o 1), indicando si hay sesgo por neurona.
  3. Consistencia entre capas CONV: en una secuencia de capas convolucionales, el cin de una capa debe corresponder al cout de la capa convolucional anterior. Una capa POOL no altera ese número de canales.

    Por ejemplo:

    CONV 3 3 1 8 1
    POOL
    CONV 3 3 8 16 1

    La primera CONV produce 8 canales, que son recibidos por la segunda CONV. Por lo tanto, en la segunda capa, cin=8 y cout=16.

  4. Parámetros de una capa CONV:

    Cada uno de los \(c_{out}\) filtros posee \(k_h \cdot k_w \cdot c_{in}\) pesos. Por lo tanto,

    \[ P_{\mathrm{CONV}} = k_h \cdot k_w \cdot c_{in} \cdot c_{out} + c_{out}\cdot\text{bias}. \]

  5. Parámetros de una capa FC:

    \[ P_{\mathrm{FC}} = \text{in}\cdot\text{out} + \text{out}\cdot\text{bias}. \]

  6. Parámetros de una capa POOL: siempre \(0\).

  7. Total de la red: sumar los parámetros entrenables de todas las capas.

  8. Salida: Para cada capa, en el orden de lectura, imprimir Camada i: P, donde \(i\) comienza en \(1\) y \(P\) es el número de parámetros de esa capa. Al final, imprimir Total: T.

9.10.3.2 📐 Ejemplo para entender cin y cout

Considere la secuencia:

CONV 3 3 1 8 1
POOL
CONV 3 3 8 16 1

En la primera capa:

  • cin=1: entra un canal;
  • cout=8: existen 8 filtros y, por lo tanto, salen 8 canales.

Cada filtro posee

\[ 3\cdot3\cdot1=9 \]

pesos. Como existen 8 filtros:

\[ 9\cdot8=72 \]

pesos. Con un sesgo por filtro:

\[ 72+8=80. \]

En la segunda capa:

  • cin=8: entran los 8 canales producidos por la primera CONV;
  • cout=16: existen 16 filtros y, por lo tanto, salen 16 canales.

Cada filtro posee

\[ 3\cdot3\cdot8=72 \]

pesos. Como existen 16 filtros:

\[ 72\cdot16=1152 \]

pesos. Con 16 sesgos:

\[ 1152+16=1168. \]

Así, las dos capas poseen, respectivamente, 80 y 1168 parámetros entrenables.

Observe que cout no es \(cin\) multiplicado por el número de filtros. El número de filtros es exactamente cout: cada filtro combina todos los canales de entrada y produce un único canal de salida.

9.10.3.3 📌 Restricciones Computacionales

  • Independencia de la dimensión espacial: la entrada no informa \(H \times W\). El conteo de una capa CONV depende solo de kh, kw, cin y cout.
  • Consistencia de los canales: para dos capas CONV consecutivas, el cin de la segunda debe ser igual al cout de la primera. Una capa POOL preserva el número de canales.
  • bias siempre 0 o 1: multiplique directamente el término de sesgo por ese valor.
  • Capas POOL sin argumentos adicionales: la línea contiene solo la palabra POOL.
  • Capas FC: el número de entradas in se proporciona explícitamente. No es necesario calcular las dimensiones espaciales producidas por las capas anteriores.
  • Todos los valores numéricos de entrada son enteros no negativos.

9.10.3.4 🧠 Fundamentación Teórica

Elemento Papel en el conteo de parámetros
\(c_{in}\) Número de canales recibidos por la capa
\(c_{out}\) Número de filtros y, por lo tanto, de canales producidos por la capa
Filtro convolucional Cada filtro posee \(k_h \cdot k_w \cdot c_{in}\) pesos y produce un canal de salida
Compartición de pesos El mismo filtro se reutiliza en diferentes posiciones de la entrada, haciendo el conteo independiente de \(H \times W\)
Sesgo Un único parámetro adicional por filtro (CONV) o por neurona (FC)
Pooling Puede alterar \(H \times W\), pero no posee parámetros entrenables y preserva el número de canales
Capa FC Posee un peso para cada combinación entre entrada y neurona de salida

9.10.3.5 🧩 Métodos del morph.py que pueden ayudar

Este ejercicio es puramente aritmético y no utiliza directamente funciones del morph.py. El conteo puede, sin embargo, verificarse en una arquitectura real implementada en PyTorch mediante:

sum(p.numel() for p in modelo.parameters())

Esta expresión contabiliza los parámetros del modelo, incluyendo pesos y sesgos.

9.10.3.6 📦 Especificación de Entrada y Salida (VPL)

Entrada:

  • Línea 1: Entero \(L\).
  • Próximas \(L\) líneas: descripción de cada capa, en el formato CONV kh kw cin cout bias, POOL o FC in out bias.

Salida:

  • \(L\) líneas en el formato Camada i: P.
  • Última línea: Total: T.

9.10.3.7 📌 Ejemplos

Entrada Salida Observación
3
CONV 3 3 1 8 1
POOL
FC 1352 10 1
Camada 1: 80
Camada 2: 0
Camada 3: 13530
Total: 13610
Red simple con una convolución, pooling y capa de clasificación.
5
CONV 3 3 1 8 1
POOL
CONV 3 3 8 16 1
POOL
FC 400 10 1
Camada 1: 80
Camada 2: 0
Camada 3: 1168
Camada 4: 0
Camada 5: 4010
Total: 5258
Pequeña CNN con dos convoluciones, dos poolings y una capa totalmente conectada.
6
CONV 3 3 1 8 1
POOL
CONV 3 3 8 16 1
POOL
FC 256 32 1
FC 32 10 1
Camada 1: 80
Camada 2: 0
Camada 3: 1168
Camada 4: 0
Camada 5: 8224
Camada 6: 330
Total: 9802
CNN pequeña con dos convoluciones, pooling intermedio y dos capas totalmente conectadas para clasificación.
🎮 Simulador: Conteo de Parámetros 🟡 compartilhamento de pesos
CONV Bloque azul POOL Cilindro verde FC Rombo naranja BATCH Pila roja 🖱️ Arrastra para mover capas
32×32
1
4
3
🧠 Visualización 3D
🖱️ Arrastra capas | Scroll zoom | P pausa
Figura 9.45: Simulador EP09_03: Conteo de Parámetros — Convolución vs. Capa Totalmente Conectada
%%writefile EP09_03.py
# Código Python
Overwriting EP09_03.py
TestSuite("EP09_03.py").run()
✔️ EP09_03.cases ya existe en casos/
📋 3 caso(s) cargado(s) de casos/EP09_03.cases

🔍 Probando Python: EP09_03.py
⚠️ EP09_03.py: archivo vacío (menos de 3 líneas). Pruebas omitidas.