Normalizzazioni

Visualizza su TensorFlow.org Esegui in Google Colab Visualizza la fonte su GitHub Scarica taccuino

Panoramica

Questo notebook fornisce una breve introduzione nelle strati di normalizzazione di tensorflow. I livelli attualmente supportati sono:

  • Gruppo Normalizzazione (tensorflow Addons)
  • Istanza Normalizzazione (tensorflow Addons)
  • Strato di Normalizzazione (tensorflow Core)

L'idea alla base di questi livelli è di normalizzare l'output di un livello di attivazione per migliorare la convergenza durante l'allenamento. In contrasto con la normalizzazione lotti questi normalizzazione non funzionano su lotti, invece normalizzare le attivazioni di un singolo campione, che li rende adatti per reti neual ricorrenti pure.

In genere la normalizzazione viene eseguita calcolando la media e la deviazione standard di un sottogruppo nel tensore di input. È anche possibile applicare una scala e un fattore di offset anche a questo.

\(y_{i} = \frac{\gamma ( x_{i} - \mu )}{\sigma }+ \beta\)

\( y\) : Uscita

\(x\) : Input

\(\gamma\) : fattore di scala

\(\mu\): media

\(\sigma\): Deviazione standard

\(\beta\): Fattore Offset

L'immagine seguente mostra la differenza tra queste tecniche. Ogni sottotrama mostra un tensore di input, con N come asse batch, C come asse canale e (H, W) come assi spaziali (altezza e larghezza di un'immagine, ad esempio). I pixel in blu sono normalizzati dalla stessa media e varianza, calcolata aggregando i valori di questi pixel.

Fonte: ( https://arxiv.org/pdf/1803.08494.pdf )

I pesi gamma e beta sono addestrabili in tutti i livelli di normalizzazione per compensare l'eventuale perdita di capacità di rappresentazione. È possibile attivare questi fattori impostando il center o la scale di bandiera a True . Naturalmente è possibile utilizzare initializers , constraints e regularizer per beta e gamma di sintonizzare questi valori durante il processo di formazione.

Impostare

Installa Tensorflow 2.0 e Tensorflow-Addons

pip install -U tensorflow-addons
import tensorflow as tf
import tensorflow_addons as tfa

Preparazione del set di dati

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

Esercitazione sulla normalizzazione di gruppo

introduzione

La normalizzazione del gruppo (GN) divide i canali dei tuoi ingressi in sottogruppi più piccoli e normalizza questi valori in base alla loro media e varianza. Poiché GN lavora su un singolo esempio, questa tecnica è indipendente dalla dimensione del lotto.

GN ha ottenuto sperimentalmente un punteggio vicino alla normalizzazione batch nelle attività di classificazione delle immagini. Può essere utile utilizzare GN invece della normalizzazione batch nel caso in cui la dimensione_batch complessiva sia bassa, il che porterebbe a cattive prestazioni della normalizzazione batch

Esempio

Divisione di 10 canali dopo un livello Conv2D in 5 sottogruppi in un'impostazione standard "canali ultimi":

model = tf.keras.models.Sequential([
  # Reshape into "channels last" setup.
  tf.keras.layers.Reshape((28,28,1), input_shape=(28,28)),
  tf.keras.layers.Conv2D(filters=10, kernel_size=(3,3),data_format="channels_last"),
  # Groupnorm Layer
  tfa.layers.GroupNormalization(groups=5, axis=3),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_test, y_test)
313/313 [==============================] - 3s 3ms/step - loss: 0.4707 - accuracy: 0.8613
<keras.callbacks.History at 0x7f63a5c5f490>

Esercitazione sulla normalizzazione delle istanze

introduzione

La normalizzazione dell'istanza è un caso speciale di normalizzazione del gruppo in cui la dimensione del gruppo è la stessa dimensione del canale (o la dimensione dell'asse).

I risultati sperimentali mostrano che la normalizzazione dell'istanza funziona bene sul trasferimento di stile quando si sostituisce la normalizzazione batch. Recentemente, la normalizzazione delle istanze è stata utilizzata anche in sostituzione della normalizzazione batch nei GAN.

Esempio

Applicazione della normalizzazione dell'istanza dopo un livello Conv2D e utilizzo di una scala e di un fattore di offset inizializzati uniformi.

model = tf.keras.models.Sequential([
  # Reshape into "channels last" setup.
  tf.keras.layers.Reshape((28,28,1), input_shape=(28,28)),
  tf.keras.layers.Conv2D(filters=10, kernel_size=(3,3),data_format="channels_last"),
  # LayerNorm Layer
  tfa.layers.InstanceNormalization(axis=3, 
                                   center=True, 
                                   scale=True,
                                   beta_initializer="random_uniform",
                                   gamma_initializer="random_uniform"),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_test, y_test)
313/313 [==============================] - 1s 3ms/step - loss: 0.5367 - accuracy: 0.8405
<keras.callbacks.History at 0x7f63a58d9f50>

Esercitazione sulla normalizzazione dei livelli

introduzione

La normalizzazione del livello è un caso speciale di normalizzazione del gruppo in cui la dimensione del gruppo è 1. La media e la deviazione standard vengono calcolate da tutte le attivazioni di un singolo campione.

I risultati sperimentali mostrano che la normalizzazione dei livelli è adatta per le reti neurali ricorrenti, poiché funziona indipendentemente dalla dimensione del batch.

Esempio

Applicazione della normalizzazione del livello dopo un livello Conv2D e utilizzo di un fattore di scala e offset.

model = tf.keras.models.Sequential([
  # Reshape into "channels last" setup.
  tf.keras.layers.Reshape((28,28,1), input_shape=(28,28)),
  tf.keras.layers.Conv2D(filters=10, kernel_size=(3,3),data_format="channels_last"),
  # LayerNorm Layer
  tf.keras.layers.LayerNormalization(axis=3 , center=True , scale=True),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_test, y_test)
313/313 [==============================] - 1s 3ms/step - loss: 0.4056 - accuracy: 0.8754
<keras.callbacks.History at 0x7f63a5722d10>

Letteratura

Livello norma

Norma di istanza

Norma di gruppo