Salta al contenuto
Note per Studenti Esercizio - CNN con Keras per cinque classi (esempio d'esame 2)

Esercizio - CNN con Keras per cinque classi (esempio d'esame 2)

In questa pagina 3

Teoria: Deep learning - reti profonde, CNN e addestramento con KerasQuadro del deep learning nel corso di IA. Un neurone calcola la somma pesata degli ingressi e applica una funzione di attivazione non lineare (soglia, sigmoide, ReLU, tanh); un perceptron a soglia realizza AND, OR e NOT ma non lo XOR (non linearmente separabile), che richiede 3 neuroni su due livelli; due livelli bastano per approssimare ogni funzione continua. Uscite: lineare per la regressione, sigmoide per due classi, softmax per più classi, con perdita di entropia incrociata. Addestramento con SGD a minibatch e backpropagation (passaggio in avanti e all'indietro, gradienti che si moltiplicano: svaniscono con sigmoide e tanh). CNN: kernel appreso, stride, padding, uscita (n+2p-k)/s+1, pooling; tensori; transfer learning e dropout. RNN con stato nascosto z_t=f(z_{t-1},x_t) e BPTT, LSTM con porte, autoencoder, VAE, GAN, modelli linguistici e trasformatori con attenzione. Pipeline Keras del laboratorio 11: Sequential, Conv2D, MaxPooling2D, Flatten, Dense, compile (Adam, perdita), fit, evaluate, predict, save.Deep learning - reti profonde, CNN e addestramento con Keras → (sezione 8, la pipeline Keras del laboratorio 11). Esercizio collegato: Esercizio - CNN su CIFAR-10 con Keras (laboratorio 11). Domanda 8 del quiz da 9 CFU e domanda 6 di quello da 6 CFU: identiche (9 blank).

Testo. Implementare con Keras una CNN per una classificazione a 5 classi, con questi livelli:

  1. Conv2D con 32 filtri, kernel 3×33\times3, attivazione ReLU;
  2. MaxPooling2D con kernel 2×22\times2;
  3. Conv2D con 64 filtri, kernel 3×33\times3, ReLU;
  4. MaxPooling2D 2×22\times2;
  5. Conv2D con 64 filtri, kernel 3×33\times3, ReLU;
  6. Flatten;
  7. Dense con 64 neuroni e ReLU;
  8. Dense finale che restituisce 5 classi.
python
model = models.Blank1()
model.add(layers.Conv2D(Blank2, (3, 3), 1, activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((Blank3, Blank4)))
model.add(layers.Conv2D(Blank5, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((Blank6, Blank7)))
model.add(layers.Conv2D(Blank8, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(Blank9))

Menu: Blank 1: Sequential(), CNN(), keras.CNN(), Linear(). Blank 2, 5, 8: 32, 64, 16, 3. Blank 3, 4, 6, 7: 1, 2, 3, 4. Blank 9: 2, 3, 4, 5.

Soluzione

blank risposta perché
1 Sequential() i livelli sono in pila, uno dopo l'altro, e si aggiungono con add
2 32 primo Conv2D con 32 filtri
3, 4 2, 2 MaxPooling2D((2, 2)): finestra 2×22\times2
5 64 secondo Conv2D con 64 filtri
6, 7 2, 2 secondo pooling 2×22\times2
8 64 terzo Conv2D con 64 filtri
9 5 un neurone per classe: la dimensione dell'uscita è il numero di classi

Nel primo Conv2D, (3, 3) è la dimensione del kernel e il 1 che segue è lo stride (terzo argomento posizionale): non va modificato. input_shape=(32, 32, 3) è un'immagine a colori 32×3232\times32 (altezza, larghezza, canali).

Perché le altre opzioni sono sbagliate

  • CNN(), keras.CNN(), Linear(): in Keras non esistono. Un modello a livelli in pila è models.Sequential(); una CNN non è una classe, è una sequenza di Conv2D e MaxPooling2D.
  • 16 e 3 per i filtri: il testo dice 32, 64, 64.
  • 1, 3, 4 per il pooling: il testo dice 2×22\times2; con 1×11\times1 non ci sarebbe riduzione.
  • 2, 3, 4 per l'ultimo Dense: le classi sono 5.

Nota: per classificare con più classi di solito l'ultimo Dense ha activation='softmax'; il quiz non la chiede e lascia solo il numero di neuroni.

Verifica: forme e parametri (model.summary())

Senza padding ("valid"), ⌊(n−3)/1⌋+1=n−2\lfloor(n-3)/1\rfloor+1=n-2 per ogni convoluzione; il pooling 2×22\times2 dimezza (per difetto). Parametri di una convoluzione: (khkwCin+1)Cout(k_hk_wC_{in}+1)C_{out}.

livello forma di uscita parametri
Conv2D 32 30×30×3230\times30\times32 (3⋅3⋅3+1)⋅32=896(3\cdot3\cdot3+1)\cdot32=896
MaxPooling2D 15×15×3215\times15\times32 0
Conv2D 64 13×13×6413\times13\times64 (3⋅3⋅32+1)⋅64=18 496(3\cdot3\cdot32+1)\cdot64=18\,496
MaxPooling2D 6×6×646\times6\times64 (13/2=6,513/2=6{,}5 per difetto) 0
Conv2D 64 4×4×644\times4\times64 (3⋅3⋅64+1)⋅64=36 928(3\cdot3\cdot64+1)\cdot64=36\,928
Flatten 10241024 (4⋅4⋅644\cdot4\cdot64) 0
Dense 64 6464 1024⋅64+64=65 6001024\cdot64+64=65\,600
Dense 5 55 64⋅5+5=32564\cdot5+5=325

Totale: 896+18 496+36 928+65 600+325=122 245896+18\,496+36\,928+65\,600+325=\mathbf{122\,245} parametri (ricalcolato con Python).

Versione ripasso

Teoria: Deep learning - reti profonde, CNN e addestramento con KerasQuadro del deep learning nel corso di IA. Un neurone calcola la somma pesata degli ingressi e applica una funzione di attivazione non lineare (soglia, sigmoide, ReLU, tanh); un perceptron a soglia realizza AND, OR e NOT ma non lo XOR (non linearmente separabile), che richiede 3 neuroni su due livelli; due livelli bastano per approssimare ogni funzione continua. Uscite: lineare per la regressione, sigmoide per due classi, softmax per più classi, con perdita di entropia incrociata. Addestramento con SGD a minibatch e backpropagation (passaggio in avanti e all'indietro, gradienti che si moltiplicano: svaniscono con sigmoide e tanh). CNN: kernel appreso, stride, padding, uscita (n+2p-k)/s+1, pooling; tensori; transfer learning e dropout. RNN con stato nascosto z_t=f(z_{t-1},x_t) e BPTT, LSTM con porte, autoencoder, VAE, GAN, modelli linguistici e trasformatori con attenzione. Pipeline Keras del laboratorio 11: Sequential, Conv2D, MaxPooling2D, Flatten, Dense, compile (Adam, perdita), fit, evaluate, predict, save.Deep learning - reti profonde, CNN e addestramento con Keras →.

  • models.Sequential(); Conv2D(32, (3,3), 1, ...); MaxPooling2D((2,2)); Conv2D(64, (3,3)); MaxPooling2D((2,2)); Conv2D(64, (3,3)); Flatten(); Dense(64); Dense(5). Il 1 è lo stride.
  • Distrattori: CNN(), keras.CNN(), Linear() non esistono; 16 e 3 non sono nel testo; ultimo Dense = numero di classi.
  • Forme: 32→30→15→13→6→432\to30\to15\to13\to6\to4, flatten 10241024. Parametri: 896+18 496+36 928+65 600+325=122 245896+18\,496+36\,928+65\,600+325=122\,245.

Errori tipici: CNN(); pooling 1×11\times1; scambiare i filtri (32, 64, 64) o i neuroni finali (5).

Teoria collegata