9.10.3 EP09_03 🟡 Conteggio dei Parametri Addestrabili di una CNN
Questo EP formalizza il conteggio dei parametri addestrabili di una CNN. Data la descrizione testuale di una piccola architettura, composta da layer convoluzionali, di pooling e completamente connessi, determinare, per ogni layer, il numero di parametri addestrabili e il totale della rete.
L’architettura deve essere interpretata sequenzialmente: l’uscita di un layer convoluzionale diventa l’ingresso del layer successivo compatibile. Pertanto, il numero di canali prodotti da un layer CONV determina il numero di canali di ingresso (cin) del layer convoluzionale successivo.
In un layer convoluzionale, è importante distinguere canali di ingresso e canali di uscita:
- \(c_{in}\) (channels in) è il numero di canali che entrano nel layer. Un’immagine in scala di grigi ha \(c_{in}=1\), mentre un’immagine RGB ha \(c_{in}=3\). In un layer convoluzionale intermedio,
cinè normalmente uguale al numero di canali prodotti dal layerCONVprecedente. - \(c_{out}\) (channels out) è il numero di canali prodotti dal layer. È uguale al numero di filtri utilizzati. Pertanto, se un layer ha 16 filtri, produce \(c_{out}=16\) canali.
Ad esempio, si consideri la sequenza:
CONV 3 3 1 8 1
POOL
CONV 3 3 8 16 1
POOL
FC 784 10 1
La prima convoluzione riceve un’immagine con un canale e produce 8 canali. Dopo il pooling, la seconda convoluzione riceve questi 8 canali e ne produce 16. Il layer POOL non altera il numero di canali, può solo ridurre le dimensioni spaziali. Il layer FC riceve la quantità di ingressi indicata nella propria descrizione.
Ogni filtro convoluzionale ha dimensioni
\[ k_h \times k_w \times c_{in}. \]
Pertanto, un layer con \(c_{out}\) filtri ha
\[ k_h \cdot k_w \cdot c_{in} \cdot c_{out} \]
pesi. Se c’è un bias, si aggiunge un parametro per ogni filtro, totalizzando altri \(c_{out}\) parametri.
Il punto centrale di questo esercizio è osservare che la quantità di parametri di un layer convoluzionale non dipende dalle dimensioni spaziali (\(H \times W\)) della mappa delle caratteristiche. Ciò è dovuto alla condivisione dei pesi: lo stesso filtro viene riutilizzato in diverse posizioni dell’ingresso.
9.10.3.1 📋 Linee Guida di Implementazione
Ingresso: Leggere l’intero \(L\) (numero di layer dell’architettura, nell’ordine in cui vengono applicati).
Layer: Leggere \(L\) righe, ciascuna descrive un layer in uno dei tre formati:
CONV kh kw cin cout bias— layer convoluzionale con kernel \(k_h \times k_w\), \(c_{in}\) canali di ingresso, \(c_{out}\) canali di uscita ebias(0 o 1), che indica se c’è un bias per filtro;POOL— layer di pooling (massimo o medio), che non ha parametri addestrabili e preserva il numero di canali;FC in out bias— layer completamente connesso coniningressi,outuscite ebias(0 o 1), che indica se c’è un bias per neurone.
Coerenza tra layer
CONV: in una sequenza di layer convoluzionali, ilcindi un layer deve corrispondere alcoutdel layer convoluzionale precedente. Un layerPOOLnon altera questo numero di canali.Ad esempio:
CONV 3 3 1 8 1 POOL CONV 3 3 8 16 1La prima
CONVproduce 8 canali, che vengono ricevuti dalla secondaCONV. Pertanto, nel secondo layer,cin=8ecout=16.Parametri di un layer
CONV:Ciascuno dei \(c_{out}\) filtri ha \(k_h \cdot k_w \cdot c_{in}\) pesi. Pertanto,
\[ P_{\mathrm{CONV}} = k_h \cdot k_w \cdot c_{in} \cdot c_{out} + c_{out}\cdot\text{bias}. \]
Parametri di un layer
FC:\[ P_{\mathrm{FC}} = \text{in}\cdot\text{out} + \text{out}\cdot\text{bias}. \]
Parametri di un layer
POOL: sempre \(0\).Totale della rete: sommare i parametri addestrabili di tutti i layer.
Uscita: Per ogni layer, nell’ordine di lettura, stampare
Camada i: P, dove \(i\) inizia da \(1\) e \(P\) è il numero di parametri di quel layer. Alla fine, stampareTotal: T.
9.10.3.2 📐 Esempio per capire cin e cout
Si consideri la sequenza:
CONV 3 3 1 8 1
POOL
CONV 3 3 8 16 1
Nel primo layer:
cin=1: entra un canale;cout=8: ci sono 8 filtri e, quindi, escono 8 canali.
Ogni filtro ha
\[ 3\cdot3\cdot1=9 \]
pesi. Poiché ci sono 8 filtri:
\[ 9\cdot8=72 \]
pesi. Con un bias per filtro:
\[ 72+8=80. \]
Nel secondo layer:
cin=8: entrano gli 8 canali prodotti dalla primaCONV;cout=16: ci sono 16 filtri e, quindi, escono 16 canali.
Ogni filtro ha
\[ 3\cdot3\cdot8=72 \]
pesi. Poiché ci sono 16 filtri:
\[ 72\cdot16=1152 \]
pesi. Con 16 bias:
\[ 1152+16=1168. \]
Pertanto, i due layer hanno, rispettivamente, 80 e 1168 parametri addestrabili.
Si noti che cout non è \(cin\) moltiplicato per il numero di filtri. Il numero di filtri è esattamente cout: ogni filtro combina tutti i canali di ingresso e produce un singolo canale di uscita.
9.10.3.3 📌 Vincoli Computazionali
- Indipendenza dalla dimensione spaziale: l’ingresso non fornisce \(H \times W\). Il conteggio di un layer
CONVdipende solo dakh,kw,cinecout. - Coerenza dei canali: per due layer
CONVconsecutivi, ilcindel secondo deve essere uguale alcoutdel primo. Un layerPOOLpreserva il numero di canali. biassempre 0 o 1: moltiplicare direttamente il termine di bias per questo valore.- Layer
POOLsenza argomenti aggiuntivi: la riga contiene solo la parolaPOOL. - Layer
FC: il numero di ingressiinè fornito esplicitamente. Non è necessario calcolare le dimensioni spaziali prodotte dai layer precedenti. - Tutti i valori numerici di ingresso sono interi non negativi.
9.10.3.4 🧠 Fondamenti Teorici
| Elemento | Ruolo nel conteggio dei parametri |
|---|---|
| \(c_{in}\) | Numero di canali ricevuti dal layer |
| \(c_{out}\) | Numero di filtri e, quindi, di canali prodotti dal layer |
| Filtro convoluzionale | Ogni filtro ha \(k_h \cdot k_w \cdot c_{in}\) pesi e produce un canale di uscita |
| Condivisione dei pesi | Lo stesso filtro viene riutilizzato in diverse posizioni dell’ingresso, rendendo il conteggio indipendente da \(H \times W\) |
| Bias | Un singolo parametro aggiuntivo per filtro (CONV) o per neurone (FC) |
| Pooling | Può alterare \(H \times W\), ma non ha parametri addestrabili e preserva il numero di canali |
Layer FC |
Ha un peso per ogni combinazione tra ingresso e neurone di uscita |
9.10.3.5 🧩 Metodi di morph.py che possono aiutare
Questo esercizio è puramente aritmetico e non utilizza direttamente le funzioni di morph.py. Il conteggio può, tuttavia, essere verificato in un’architettura reale implementata in PyTorch tramite:
sum(p.numel() for p in modelo.parameters())Questa espressione calcola i parametri del modello, inclusi pesi e bias.
9.10.3.6 📦 Specifica di Ingresso e Uscita (VPL)
Ingresso:
- Riga 1: Intero \(L\).
- Prossime \(L\) righe: descrizione di ogni layer, nel formato
CONV kh kw cin cout bias,POOLoFC in out bias.
Uscita:
- \(L\) righe nel formato
Camada i: P. - Ultima riga:
Total: T.
9.10.3.7 📌 Esempi
| Ingresso | Uscita | Osservazione |
|---|---|---|
| 3 CONV 3 3 1 8 1 POOL FC 1352 10 1 |
Camada 1: 80 Camada 2: 0 Camada 3: 13530 Total: 13610 |
Rete semplice con una convoluzione, pooling e layer di classificazione. |
| 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 |
Piccola CNN con due convoluzioni, due pooling e un layer completamente connesso. |
| 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 |
Piccola CNN con due convoluzioni, pooling intermedio e due layer completamente connessi per la classificazione. |
%%writefile EP09_03.py
# Codice PythonOverwriting EP09_03.py
TestSuite("EP09_03.py").run()✔️ EP09_03.cases esiste già in casos/
📋 3 caso/i caricato/i da casos/EP09_03.cases
🔍 Test di Python: EP09_03.py
⚠️ EP09_03.py: file vuoto (meno di 3 righe). Test saltati.