Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Normalizzazione

Visualizza su TensorFlow.org Esegui in Google Colab Visualizza sorgente su GitHub Scarica notebook

Panoramica

Questo blocco note fornisce una breve introduzione ai livelli di normalizzazione di TensorFlow. I livelli attualmente supportati sono:

  • Normalizzazione del gruppo (componenti aggiuntivi TensorFlow)
  • Normalizzazione delle istanze (componenti aggiuntivi TensorFlow)
  • Normalizzazione dei livelli (TensorFlow Core)

L'idea di base alla base di questi livelli è di normalizzare l'uscita di uno strato di attivazione per migliorare la convergenza durante l'allenamento. A differenza della normalizzazione batch, queste normalizzazioni non funzionano sui batch, ma normalizzano le attivazioni di un singolo campione, rendendole adatte anche a reti neual ricorrenti.

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 $: output

$ x $: input

$ \ gamma $: fattore di scala

$ \ mu $: media

$ \ sigma $: deviazione standard

$ \ beta $: fattore di 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 del canale e (H, W) come assi spaziali (altezza e larghezza di un'immagine per esempio). I pixel in blu sono normalizzati con la 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 la possibile perdita di capacità di rappresentazione. È possibile attivare questi fattori impostando il center o il flag di scale su True . Ovviamente puoi usare initializers , constraints e regularizer per beta e gamma per regolare questi valori durante il processo di addestramento.

Impostare

Installa Tensorflow 2.0 e Tensorflow-Addons

pip install -q -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
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 0s 0us/step

Tutorial sulla normalizzazione del gruppo

introduzione

La normalizzazione di gruppo (GN) divide i canali degli input in sottogruppi più piccoli e normalizza questi valori in base alla loro media e varianza. Poiché GN funziona su un singolo esempio, questa tecnica è indipendente dalla dimensione del batch.

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

Esempio

Suddivisione 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 [==============================] - 1s 3ms/step - loss: 0.4634 - accuracy: 0.8625

<tensorflow.python.keras.callbacks.History at 0x7f2e8edfad68>

Tutorial 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 della dimensione del canale (o della dimensione dell'asse).

I risultati sperimentali mostrano che la normalizzazione delle istanze 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

Applicando InstanceNormalization dopo uno strato Conv2D e utilizzando una scala inizializzata uniforme e un fattore di 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
  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 2ms/step - loss: 0.5034 - accuracy: 0.8514

<tensorflow.python.keras.callbacks.History at 0x7f2ee220a588>

Tutorial sulla normalizzazione dei livelli

introduzione

La normalizzazione dei livelli è 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 dei batch.

Esempio

Applicazione della normalizzazione dei livelli dopo uno strato 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=1 , 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.4377 - accuracy: 0.8718

<tensorflow.python.keras.callbacks.History at 0x7f2ee2048fd0>

Letteratura

Norma strato

Norma istanza

Norma di gruppo

Panoramica completa delle normalizzazioni