Codice del generatore
Come il generatore crea immagini 28X28X1, partendo da un vettore di rumore casuale di dimensione 100
Spiegazione del Codice del Generatore
Il generatore è una parte cruciale di una rete GAN (Generative Adversarial Network) ed è responsabile della creazione di immagini realistiche a partire da un vettore di rumore casuale.Analizziamo in dettaglio come il codice per il generatore crea immagini e come definisce le loro dimensioni.
Codice del Generatore
def make_generator_model():
model = tf.keras.Sequential()
# Primo strato: Dense
model.add(layers.Dense(7*7*256, use_bias=False, input_shape=(100,)))
model.add(layers.BatchNormalization())
model.add(layers.ReLU())
# Reshape per creare una mappa di caratteristiche 7x7 con 256 canali
model.add(layers.Reshape((7, 7, 256)))
# Secondo strato: Conv2DTranspose
model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))
model.add(layers.BatchNormalization())
model.add(layers.ReLU())
# Terzo strato: Conv2DTranspose
model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))
model.add(layers.BatchNormalization())
model.add(layers.ReLU())
# Quarto strato: Conv2DTranspose
model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))
return model
Dettagli del Processo di Generazione delle Immagini
Input Layer
model.add(layers.Dense(7*7*256, use_bias=False, input_shape=(100,)))
- **Input Shape**: `(100,)`
- **Descrizione**: Questo strato riceve un vettore di rumore casuale di dimensione 100.
Lo strato denso (fully connected) trasforma questo vettore in un tensore di dimensione `7*7*256` (12.544 valori).
Batch Normalization e ReLU
model.add(layers.BatchNormalization())
model.add(layers.ReLU())
- **Descrizione**: La Batch Normalization standardizza le attivazioni del layer precedente, migliorando la stabilità e la velocità dell'addestramento.
La funzione di attivazione ReLU introduce non linearità nel modello.
Reshape Layer
model.add(layers.Reshape((7, 7, 256)))
- **Descrizione**: Questo strato cambia la forma del tensore dallo strato denso in una mappa di caratteristiche tridimensionale `7x7x256`.
Transposed Convolution (Conv2DTranspose)
model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))
model.add(layers.BatchNormalization())
model.add(layers.ReLU())
- **Descrizione**: Uno strato di convoluzione trasposta applica una convoluzione inversa che aumenta la dimensione spaziale delle mappe di caratteristiche.
- **Parametri**:
- **Filtri**: 128
- **Kernel Size**: `(5, 5)`
- **Strides**: `(1, 1)`
- **Padding**: `same`
- **Output Shape**: La dimensione spaziale rimane `7x7`, ma il numero di canali è ridotto a 128.
Secondo Transposed Convolution
model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))
model.add(layers.BatchNormalization())
model.add(layers.ReLU())
- **Descrizione**: Un'altra convoluzione trasposta per aumentare ulteriormente la dimensione spaziale.
- **Parametri**:
- **Filtri**: 64
- **Kernel Size**: `(5, 5)`
- **Strides**: `(2, 2)`
- **Padding**: `same`
- **Output Shape**: La dimensione spaziale diventa `14x14`, con 64 canali.
Terzo Transposed Convolution
model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))
- **Descrizione**: L'ultimo strato di convoluzione trasposta porta la dimensione spaziale finale a `28x28`.
- **Parametri**:
- **Filtri**: 1 (Immagine in scala di grigi)
- **Kernel Size**: `(5, 5)`
- **Strides**: `(2, 2)`
- **Padding**: `same`
- **Activation**: `tanh`
- **Output Shape**: La dimensione finale dell'immagine è `28x28x1`.
Processo di Generazione delle Immagini
Il generatore prende un vettore di rumore casuale di dimensione 100 e lo trasforma attraverso una serie di strati completamente connessi e convoluzionali trasposti.Ogni strato convoluzionale trasposto aumenta la dimensione spaziale dell'immagine, mentre il numero di filtri si riduce progressivamente fino a ottenere un'immagine di dimensione `28x28` con un singolo canale (in scala di grigi).
La funzione di attivazione finale `tanh` normalizza i valori dei pixel nell'intervallo [-1, 1].
Questo processo consente alla rete di generare immagini realistiche partendo da input casuali, apprendendo progressivamente le caratteristiche del dataset durante l'addestramento.