Salta al contenuto
Note per Studenti Esercizio - Convoluzione 2D a mano

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 x=[1021310202101321]x=\begin{bmatrix}1&0&2&1\\3&1&0&2\\0&2&1&0\\1&3&2&1\end{bmatrix} e filtro h=[10−110−110−1]h=\begin{bmatrix}1&0&-1\\1&0&-1\\1&0&-1\end{bmatrix} (rivelatore di bordi verticali).

  1. Si calcoli l'uscita con stride 11 e senza padding, poi applicando ReLU e max pooling 2×22\times2.
  2. Quanto sarebbe grande l'uscita con stride 22? E con padding 11 e stride 11?
  3. Cosa cambia usando la convoluzione vera (filtro ribaltato) invece della correlazione che calcolano Keras e PyTorch?
  4. 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: O=(4−3)/1+1=2O=(4-3)/1+1=2, quindi 2×22\times2. Per ciascuna posizione si moltiplica elemento per elemento la patch 3×33\times3 per hh e si somma. Poiché hh ha colonne (1,1,1)(1,1,1), (0,0,0)(0,0,0), (−1,−1,−1)(-1,-1,-1), il risultato è somma della prima colonna della patch meno somma della terza colonna.

  • Posizione (0,0)(0,0), patch righe 00-22, colonne 00-22: [102310021]\begin{bmatrix}1&0&2\\3&1&0\\0&2&1\end{bmatrix}: colonna 00: 1+3+0=41+3+0=4; colonna 22: 2+0+1=32+0+1=3; risultato 4−3=14-3=1.
  • (0,1)(0,1), colonne 11-33: [021102210]\begin{bmatrix}0&2&1\\1&0&2\\2&1&0\end{bmatrix}: prima colonna 0+1+2=30+1+2=3, terza 1+2+0=31+2+0=3: 00.
  • (1,0)(1,0), righe 11-33, colonne 00-22: [310021132]\begin{bmatrix}3&1&0\\0&2&1\\1&3&2\end{bmatrix}: 3+0+1=43+0+1=4 meno 0+1+2=30+1+2=3: 11.
  • (1,1)(1,1), righe 11-33, colonne 11-33: [102210321]\begin{bmatrix}1&0&2\\2&1&0\\3&2&1\end{bmatrix}: 1+2+3=61+2+3=6 meno 2+0+1=32+0+1=3: 33.

y=[1013].y=\begin{bmatrix}1&0\\1&3\end{bmatrix}.

ReLU: tutti i valori sono ≥0\ge0, quindi yy resta uguale. Max pooling 2×22\times2: un solo blocco, max⁡(1,0,1,3)=3\max(1,0,1,3)=3: uscita 1×11\times1 con valore 33.

2. Altre configurazioni

  • Stride 22, P=0P=0: O=⌊(4−3)/2⌋+1=1O=\lfloor(4-3)/2\rfloor+1=1: l'unica posizione utile è quella in alto a sinistra e il risultato è [1][1].
  • Stride 11, P=1P=1: O=(4−3+2)/1+1=4O=(4-3+2)/1+1=4: uscita 4×44\times4 (la dimensione si conserva); l'immagine diventa 6×66\times6 con una cornice di zeri e il filtro passa su 1616 posizioni; per esempio in alto a sinistra la patch è [000010031]\begin{bmatrix}0&0&0\\0&1&0\\0&3&1\end{bmatrix} e il risultato è (0+0+0)−(0+0+1)=−1(0+0+0)-(0+0+1)=-1.

3. Convoluzione contro correlazione

Il filtro ribaltato rispetto a entrambi gli assi (rotazione di 180°180°) è h′=[−101−101−101]=−hh'=\begin{bmatrix}-1&0&1\\-1&0&1\\-1&0&1\end{bmatrix}=-h. Quindi la convoluzione vera dà −y=[−10−1−3]-y=\begin{bmatrix}-1&0\\-1&-3\end{bmatrix}: 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

hh 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 00 in zone uniformi. Nell'immagine l'uscita massima, 33, è in basso a destra, dove a sinistra ci sono 1,2,31,2,3 e a destra 2,0,12,0,1. Il filtro orizzontale dell'esempio del capitolo ha righe (1,2,1)(1,2,1), (0,0,0)(0,0,0), (−1,−2,−1)(-1,-2,-1) e fa lo stesso ruotato di 90°90°.

Controllo con NumPy

python
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]]

Lezioni in cui compare

Teoria collegata