Salta al contenuto
Note per Studenti Esercizio - Dimensioni e parametri di una CNN

Esercizio - Dimensioni e parametri di una CNN

Questa pagina non ha ancora la versione ripasso: qui sotto c'è il testo completo.

In questa pagina 5

Testo. Una CNN riceve immagini a colori 32×32×332\times32\times3 ed è composta da:

  1. Conv 1616 filtri 5×55\times5, stride 11, padding nullo (valid), ReLU;
  2. MaxPool 2×22\times2, stride 22;
  3. Conv 3232 filtri 3×33\times3, stride 11, padding same (P=1P=1), ReLU;
  4. MaxPool 2×22\times2, stride 22;
  5. Flatten;
  6. Dense 6464 con ReLU;
  7. Dense 1010 con softmax.

Si calcolino la forma dell'uscita e il numero di parametri di ogni strato, il totale, il campo recettivo dopo il secondo strato convolutivo (considerando anche il primo pooling) e si dica cosa cambierebbe usando stride 22 nella seconda convoluzione. Si calcolino infine i parametri del primo strato di AlexNet.

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) →, Reti neurali - neuroni e funzioni di attivazioneUn neurone calcola $\hat y=g(w_0+w^\top x)$: somma pesata degli ingressi più bias, poi una funzione di attivazione $g$ non lineare (Perceptron a soglia, sigmoide, tanh, ReLU e varianti). Senza non linearità ogni rete è equivalente a un solo modello lineare. Una rete feed-forward impila strati di neuroni: $a^{(k)}=g(W^{(k)}a^{(k-1)}+b^{(k)})$; con uno strato nascosto è già un approssimatore universale, ma più strati rappresentano funzioni complesse con molti meno neuroni e imparano feature gerarchiche (bordi, parti, oggetti). Lo strato di uscita e la loss si scelgono dal compito: lineare+MSE (regressione), sigmoide+cross-entropy binaria, softmax+cross-entropy (multiclasse). Il numero di parametri di uno strato denso è $n_{in}n_{out}+n_{out}$. Nel lab (Keras, MNIST) una rete 784-512-10 ha 407 050 parametri e supera il 98% di accuratezza.Reti neurali - neuroni e funzioni di attivazione →.

Formule: lato dell'uscita O=⌊(W−K+2P)/S⌋+1O=\lfloor(W-K+2P)/S\rfloor+1; parametri di una convoluzione K2CinCout+CoutK^2C_{in}C_{out}+C_{out}; pooling, flatten e ReLU non hanno parametri.

Strato per strato

1. Conv 5×55\times5, 1616 filtri. O=(32−5+0)/1+1=28O=(32-5+0)/1+1=28: uscita 28×28×1628\times28\times16. Parametri: ogni filtro vede tutti i 33 canali, 5⋅5⋅3=755\cdot5\cdot3=75 pesi più 11 bias, per 1616 filtri: 75⋅16+16=1 21675\cdot16+16=1\,216.

2. MaxPool. O=⌊(28−2)/2⌋+1=14O=\lfloor(28-2)/2\rfloor+1=14: 14×14×1614\times14\times16. Parametri 00.

3. Conv 3×33\times3, 3232 filtri, P=1P=1. O=(14−3+2)/1+1=14O=(14-3+2)/1+1=14 (padding same: la dimensione si conserva): 14×14×3214\times14\times32. Parametri: 3⋅3⋅16=1443\cdot3\cdot16=144 pesi per filtro più il bias, per 3232 filtri: 144⋅32+32=4 640144\cdot32+32=4\,640.

4. MaxPool. O=(14−2)/2+1=7O=(14-2)/2+1=7: 7×7×327\times7\times32. Parametri 00.

5. Flatten. 7⋅7⋅32=1 5687\cdot7\cdot32=1\,568 valori. Parametri 00.

6. Dense 6464. 1 568⋅64+64=100 4161\,568\cdot64+64=100\,416.

7. Dense 1010. 64⋅10+10=65064\cdot10+10=650.

strato uscita parametri
Conv 5×5×165\times5\times16 28×28×1628\times28\times16 1 2161\,216
MaxPool 14×14×1614\times14\times16 00
Conv 3×3×323\times3\times32 (same) 14×14×3214\times14\times32 4 6404\,640
MaxPool 7×7×327\times7\times32 00
Flatten 1 5681\,568 00
Dense 6464 6464 100 416100\,416
Dense 1010 1010 650650

Totale: 1 216+4 640+100 416+650=106 9221\,216+4\,640+100\,416+650=106\,922 parametri. Quasi il 94%94\% è nello strato denso (100 416/106 922100\,416/106\,922): gli strati convolutivi sono economici grazie alla condivisione dei pesi.

Campo recettivo

Un neurone dopo la prima convoluzione 5×55\times5 vede 5×55\times5 pixel. Il pooling 2×22\times2 con stride 22 allarga il campo: ogni uscita del pooling dipende da 2×22\times2 neuroni vicini, quindi da una regione (5+1)×(5+1)=6×6(5+1)\times(5+1)=6\times6 dei pixel originali; e da questo punto i passi sono di 22 pixel. La seconda convoluzione 3×33\times3 guarda tre neuroni consecutivi del pooling: ognuno è spostato di 22 pixel, quindi la regione copre 6+2⋅2=106+2\cdot2=10 pixel di lato. Campo recettivo 10×1010\times10 dopo il secondo strato convolutivo. (Regola: per LL strati 3×33\times3 con stride 11 il campo è 1+2L1+2L, senza pooling; con il pooling i passi successivi valgono il doppio.)

Stride 2 nella seconda convoluzione

O=⌊(14−3+2)/2⌋+1=⌊6,5⌋+1=7O=\lfloor(14-3+2)/2\rfloor+1=\lfloor6{,}5\rfloor+1=7: l'uscita diventerebbe 7×7×327\times7\times32 già senza pooling; con il pooling successivo 3×3×32=2883\times3\times32=288 valori da appiattire, e lo strato Dense 6464 avrebbe 288⋅64+64=18 496288\cdot64+64=18\,496 parametri invece di 100 416100\,416: il totale scenderebbe a 1 216+4 640+18 496+650=25 0021\,216+4\,640+18\,496+650=25\,002.

Primo strato di AlexNet

Ingresso 227×227×3227\times227\times3, 9696 filtri 11×1111\times11, stride 44: O=(227−11)/4+1=55O=(227-11)/4+1=55, uscita 55×55×9655\times55\times96. Parametri 11⋅11⋅3⋅96+96=34 848+96=34 94411\cdot11\cdot3\cdot96+96=34\,848+96=34\,944: pochi rispetto ai 62,362{,}3 milioni totali, che sono quasi tutti negli strati densi finali (FC6 ha 9216⋅40969216\cdot4096 pesi circa).

Controllo con Keras

python
model = Sequential([Input((32, 32, 3)),
    Conv2D(16, 5, activation="relu"), MaxPool2D(2),
    Conv2D(32, 3, padding="same", activation="relu"), MaxPool2D(2),
    Flatten(), Dense(64, activation="relu"), Dense(10, activation="softmax")])
model.summary()      # Total params: 106,922

Lezioni in cui compare

Teoria collegata