Esercizio - Convoluzione 2D a mano
Questa pagina non ha ancora la versione ripasso: qui sotto c'è il testo completo.
In questa pagina 5
Testo. Immagine e filtro (rivelatore di bordi verticali).
- Si calcoli l'uscita con stride e senza padding, poi applicando ReLU e max pooling .
- Quanto sarebbe grande l'uscita con stride ? E con padding e stride ?
- Cosa cambia usando la convoluzione vera (filtro ribaltato) invece della correlazione che calcolano Keras e PyTorch?
- Si interpreti il filtro.
Teoria usata: Reti neurali convolutive (CNN)approfondimento: non nel programma di Telecomunicazioni. Una rete convolutiva (CNN) sostituisce gli strati densi con filtri piccoli che scorrono sull'immagine: ogni neurone vede solo una patch locale (campo recettivo) e i pesi del filtro sono condivisi in tutta l'immagine, quindi i parametri non dipendono dalla dimensione dell'immagine ($K^2C_{in}C_{out}+C_{out}$ per strato) e si conserva l'informazione spaziale. Dimensione dell'uscita: $\lfloor(W-K+2P)/S\rfloor+1$. Pooling (max 2x2, stride 2) sottocampiona e dà invarianza locale; i filtri 1x1 riducono i canali; struttura tipica CONV+ReLU, POOL, ..., FLATTEN, FC, SOFTMAX, addestrata con cross-entropy e backpropagation. Tre strati 3x3 hanno il campo recettivo di un 7x7 con meno parametri e più non linearità (VGG). Architetture: LeNet, AlexNet (ReLU, dropout, data augmentation), VGG, GoogLeNet (moduli Inception), ResNet (blocchi residui $H(x)=F(x)+x$), EfficientNet. Nel lab: CNN su Fashion-MNIST (241 546 parametri) e su CIFAR-10 (122 570).Reti neurali convolutive (CNN) →, Calcolo della convoluzione e sue proprietàIl supporto della convoluzione è la somma dei supporti, $\operatorname{rect}*\operatorname{rect}=\Lambda$, e due esponenziali causali danno $(e^{-bt}-e^{-at})/(a-b)$. Si calcola con il metodo grafico a casi (ribaltare, traslare, individuare gli intervalli di sovrapposizione). Proprietà: lineare, commutativa, associativa, $\delta$ è l'elemento neutro, la traslazione si somma, l'area è il prodotto delle aree.Calcolo della convoluzione e sue proprietà →.
1. Uscita con stride 1, padding nullo
Dimensione: , quindi . Per ciascuna posizione si moltiplica elemento per elemento la patch per e si somma. Poiché ha colonne , , , il risultato è somma della prima colonna della patch meno somma della terza colonna.
- Posizione , patch righe -, colonne -: : colonna : ; colonna : ; risultato .
- , colonne -: : prima colonna , terza : .
- , righe -, colonne -: : meno : .
- , righe -, colonne -: : meno : .
ReLU: tutti i valori sono , quindi resta uguale. Max pooling : un solo blocco, : uscita con valore .
2. Altre configurazioni
- Stride , : : l'unica posizione utile è quella in alto a sinistra e il risultato è .
- Stride , : : uscita (la dimensione si conserva); l'immagine diventa con una cornice di zeri e il filtro passa su posizioni; per esempio in alto a sinistra la patch è e il risultato è .
3. Convoluzione contro correlazione
Il filtro ribaltato rispetto a entrambi gli assi (rotazione di ) è . Quindi la convoluzione vera dà : segni opposti. Per questo filtro la differenza è solo di segno; in generale è un altro filtro. Poiché in una CNN i pesi si imparano, la scelta è irrilevante (la rete impara il filtro ribaltato); le librerie usano la correlazione perché non serve ribaltare.
4. Interpretazione
somma la colonna sinistra della finestra e sottrae la destra: risponde (valore alto positivo) quando i pixel a sinistra sono più chiari di quelli a destra, cioè a un bordo verticale da chiaro a scuro; è circa in zone uniformi. Nell'immagine l'uscita massima, , è in basso a destra, dove a sinistra ci sono e a destra . Il filtro orizzontale dell'esempio del capitolo ha righe , , e fa lo stesso ruotato di .
Controllo con NumPy
import numpy as np
x = np.array([[1,0,2,1],[3,1,0,2],[0,2,1,0],[1,3,2,1]]); h = np.array([[1,0,-1]]*3)
y = np.array([[(x[i:i+3, j:j+3] * h).sum() for j in range(2)] for i in range(2)])
print(y) # [[1 0] [1 3]]