EDI+VA · Esercizio di Programmazione

EP09_03 — 🟡 Conteggio dei Parametri Addestrabili di una CNN

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 layer CONV precedente.
  • \(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

  1. Ingresso: Leggere l’intero \(L\) (numero di layer dell’architettura, nell’ordine in cui vengono applicati).

  2. 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 e bias (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 con in ingressi, out uscite e bias (0 o 1), che indica se c’è un bias per neurone.
  3. Coerenza tra layer CONV: in una sequenza di layer convoluzionali, il cin di un layer deve corrispondere al cout del layer convoluzionale precedente. Un layer POOL non altera questo numero di canali.

    Ad esempio:

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

    La prima CONV produce 8 canali, che vengono ricevuti dalla seconda CONV. Pertanto, nel secondo layer, cin=8 e cout=16.

  4. 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}. \]

  5. Parametri di un layer FC:

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

  6. Parametri di un layer POOL: sempre \(0\).

  7. Totale della rete: sommare i parametri addestrabili di tutti i layer.

  8. 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, stampare Total: 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 prima CONV;
  • 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 CONV dipende solo da kh, kw, cin e cout.
  • Coerenza dei canali: per due layer CONV consecutivi, il cin del secondo deve essere uguale al cout del primo. Un layer POOL preserva il numero di canali.
  • bias sempre 0 o 1: moltiplicare direttamente il termine di bias per questo valore.
  • Layer POOL senza argomenti aggiuntivi: la riga contiene solo la parola POOL.
  • Layer FC: il numero di ingressi in è 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, POOL o FC 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.
🎮 Simulatore: Conteggio dei Parametri 🟡 condivisione dei pesi
CONV Blocco blu POOL Cilindro verde FC Rombo arancione BATCH Pila rossa 🖱️ Trascina per spostare i livelli
32×32
1
4
3
🧠 Visualizzazione 3D
🖱️ Trascina livelli | Scroll zoom | P pausa
Figura 9.45: Simulatore EP09_03: Conteggio dei Parametri — Convoluzione vs. Strato Totalmente Connesso
%%writefile EP09_03.py
# Codice Python
Overwriting 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.