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:
- Conv2D con 32 filtri, kernel , attivazione ReLU;
- MaxPooling2D con kernel ;
- Conv2D con 64 filtri, kernel , ReLU;
- MaxPooling2D ;
- Conv2D con 64 filtri, kernel , ReLU;
- Flatten;
- Dense con 64 neuroni e ReLU;
- Dense finale che restituisce 5 classi.
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 |
| 5 | 64 | secondo Conv2D con 64 filtri |
| 6, 7 | 2, 2 | secondo pooling |
| 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 (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 diConv2DeMaxPooling2D.- 16 e 3 per i filtri: il testo dice 32, 64, 64.
- 1, 3, 4 per il pooling: il testo dice ; con 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"), per ogni convoluzione; il pooling dimezza (per difetto). Parametri di una convoluzione: .
| livello | forma di uscita | parametri |
|---|---|---|
| Conv2D 32 | ||
| MaxPooling2D | 0 | |
| Conv2D 64 | ||
| MaxPooling2D | ( per difetto) | 0 |
| Conv2D 64 | ||
| Flatten | () | 0 |
| Dense 64 | ||
| Dense 5 |
Totale: parametri (ricalcolato con Python).
Versione ripasso
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). Il1è lo stride.- Distrattori:
CNN(),keras.CNN(),Linear()non esistono; 16 e 3 non sono nel testo; ultimoDense= numero di classi. - Forme: , flatten . Parametri: .
Errori tipici: CNN(); pooling ; scambiare i filtri (32, 64, 64) o i neuroni finali (5).