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,
cinnormalmente es igual al número de canales producidos por la capaCONVanterior. - \(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
Entrada: Leer el entero \(L\) (número de capas de la arquitectura, en el orden en que se aplican).
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 ybias(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 coninentradas,outsalidas ybias(0 o 1), indicando si hay sesgo por neurona.
Consistencia entre capas
CONV: en una secuencia de capas convolucionales, elcinde una capa debe corresponder alcoutde la capa convolucional anterior. Una capaPOOLno altera ese número de canales.Por ejemplo:
CONV 3 3 1 8 1 POOL CONV 3 3 8 16 1La primera
CONVproduce 8 canales, que son recibidos por la segundaCONV. Por lo tanto, en la segunda capa,cin=8ycout=16.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}. \]
Parámetros de una capa
FC:\[ P_{\mathrm{FC}} = \text{in}\cdot\text{out} + \text{out}\cdot\text{bias}. \]
Parámetros de una capa
POOL: siempre \(0\).Total de la red: sumar los parámetros entrenables de todas las capas.
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, imprimirTotal: 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 primeraCONV;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
CONVdepende solo dekh,kw,cinycout. - Consistencia de los canales: para dos capas
CONVconsecutivas, elcinde la segunda debe ser igual alcoutde la primera. Una capaPOOLpreserva el número de canales. biassiempre 0 o 1: multiplique directamente el término de sesgo por ese valor.- Capas
POOLsin argumentos adicionales: la línea contiene solo la palabraPOOL. - Capas
FC: el número de entradasinse 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,POOLoFC 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. |
%%writefile EP09_03.py
# Código PythonOverwriting 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.