9.10.2 EP09_02 🟢 Pooling Manuale (Massimo e Media)
Tra i blocchi convoluzionali, l’architettura tipica di una CNN intercala livelli di pooling, che riducono la risoluzione spaziale della mappa delle caratteristiche senza introdurre nuovi parametri addestrabili — a differenza della convoluzione, il pooling non ha pesi: si limita a riassumere ogni finestra dell’ingresso in un singolo valore, tramite un massimo o una media, esattamente come formalizzato nella Sezione “Pooling”.
Sei stato incaricato di implementare questa operazione a partire da una finestra scorrevole quadrata, senza sovrapposizione parziale sui bordi (solo finestre complete), supportando i due tipi più comuni: max (preserva il valore più saliente, tipicamente usato per mantenere bordi e texture forti) e avg (smussa la regione, preservando l’informazione di intensità media).
9.10.2.1 📋 Linee Guida di Implementazione
Ingresso: Leggere le dimensioni \(H \times W\) della mappa delle caratteristiche di ingresso e i suoi \(H \times W\) valori reali.
Finestra: Leggere gli interi \(k\) (dimensione della finestra quadrata \(k \times k\)) e \(s\) (stride).
Tipo: Leggere una stringa, max o avg, che indica il tipo di pooling.
Senza riempimento: Questa operazione non utilizza padding; le finestre che supererebbero il bordo dell’ingresso vengono scartate.
Calcolo: Per ogni posizione di uscita \((i,j)\), calcolare il massimo o la media dei \(k \times k\) valori della finestra corrispondente, iniziando da \((i \cdot s,\, j \cdot s)\).
Dimensioni di uscita:\(O_h = \lfloor (H - k)/s \rfloor + 1\) e \(O_w = \lfloor (W - k)/s \rfloor + 1\).
Uscita: Stampare \(O_h\) e \(O_w\) nella prima riga, seguiti da \(O_h\) righe con \(O_w\) valori reali ciascuna, formattati con 4 cifre decimali.
9.10.2.2 📌 Vincoli Computazionali
Finestra quadrata:\(k \times k\), senza supporto per finestre rettangolari in questa versione.
Senza padding: solo le finestre interamente contenute nell’ingresso sono considerate — le dimensioni che “avanzeranno” sono semplicemente scartate.
avg usa divisione reale: la media è sempre \(\text{somma}/k^2\), anche quando il risultato ha molte cifre decimali — arrotondare solo nella formattazione finale, secondo la linea guida generale del capitolo.
Formattazione: tutti i valori di uscita con esattamente 4 cifre decimali.
9.10.2.3 🧠 Fondamento Teorico
Elemento
Ruolo nell’architettura
Pooling massimo
Preserva l’attivazione più forte della finestra; comune dopo livelli convoluzionali per mantenere bordi e texture salienti
Pooling medio
Smussa la regione, preservando l’intensità media; comune nei livelli finali (global average pooling)
Assenza di parametri
Differenzia il pooling dalla convoluzione: riduce la risoluzione spaziale senza costi aggiuntivi di addestramento
Riduzione della risoluzione
Contribuisce all’invarianza rispetto a piccole traslazioni e alla riduzione del costo computazionale dei livelli successivi
9.10.2.4 🧩 Metodi di morph.py che possono aiutare
Il morph.py non implementa il pooling con sottocampionamento direttamente, ma due famiglie di operazioni mostrano la stessa idea sotto un’altra ottica, utile per verificare la tua intuizione:
mm.dil(f, Bc) / mm.dil0(f, B) — dilatazione morfologica: sostituisce ogni pixel con il massimo del suo intorno definito dall’elemento strutturante \(B\) (es.: mm.sebox(n) per una finestra \((2n+1)\times(2n+1)\)). È concettualmente un “max-pooling senza sottocampionamento” (produce un’immagine della stessa dimensione, invece che ridotta).
mm.blur(f, N) — smussatura per media in una finestra \(N \times N\), analoga all’avg-pooling, anch’essa senza riduzione della risoluzione.
mm.readImg(h, w, dtype='float') — utile per leggere la mappa di ingresso in virgola mobile.
🎮 Simulatore: Pooling Manuale🟢 senza padding, finestre complete
Ingresso 4×4 fisso — regola la dimensione della finestra (k), lo stride (s) e il tipo, esattamente i parametri che EP09_02 legge in ingresso, e guarda come cambiano la dimensione e i valori dell'uscita.
Finestra (k)
Stride (s)
Tipo
(0,0)
Ingresso X (4×4)
fuori dalla finestra finestra corrente scartato (avanzo)
Uscita Y (pooling)
💡 Ogni posizione dello slider rivela una cella della matrice di uscita. Le celle grigio tratteggiate nell'ingresso sono "avanzi" che nessuna finestra raggiunge — nota come ciò accade quando (H−k) non è multiplo di s. Cambiare k, s o il tipo riavvia l'esplorazione.
Figura 9.44: Simulatore EP09_02: Pooling Manuale (massimo vs. media, con finestra k e stride s regolabili)
%%writefile EP09_02.py# Codice Python
Overwriting EP09_02.py
TestSuite("EP09_02.py").run()
✔️ EP09_02.cases esiste già in casos/
📋 4 caso/i caricato/i da casos/EP09_02.cases
🔍 Test di Python: EP09_02.py
⚠️ EP09_02.py: file vuoto (meno di 3 righe). Test saltati.