Normalizacje

Zobacz na TensorFlow.org Uruchom w Google Colab Wyświetl źródło na GitHub Pobierz notatnik

Przegląd

Notebook ten daje krótkie wprowadzenie do warstw normalizacji z TensorFlow. Obecnie obsługiwane warstwy to:

  • Grupa Normalizacja (TensorFlow dodatki)
  • Przykład Normalizacja (TensorFlow dodatki)
  • Warstwa Normalizacja (TensorFlow rdzenia)

Podstawową ideą stojącą za tymi warstwami jest normalizacja wyjścia warstwy aktywacyjnej w celu poprawy zbieżności podczas treningu. W przeciwieństwie do normalizacji wsadowym te normalizations nie działają na partiach, zamiast je znormalizować aktywacje pojedynczej próbce, dzięki czemu nadaje się do nawracających sieci neual również.

Zwykle normalizację przeprowadza się przez obliczenie średniej i odchylenia standardowego podgrupy w tensorze wejściowym. Możliwe jest również zastosowanie do tego skali i współczynnika przesunięcia.

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

\( y\) : Wyjście

\(x\) : Wejście

\(\gamma\) : współczynnik skali

\(\mu\): Średni

\(\sigma\): odchylenie standardowe

\(\beta\): Współczynnik offsetowy

Poniższy obraz przedstawia różnicę między tymi technikami. Każdy podwykres przedstawia tensor wejściowy, z N jako oś wsadu, C jako oś kanału i (H, W) jako osie przestrzenne (na przykład wysokość i szerokość obrazu). Piksele w kolorze niebieskim są znormalizowane przy użyciu tej samej średniej i wariancji, obliczonej przez agregację wartości tych pikseli.

Źródło: ( https://arxiv.org/pdf/1803.08494.pdf )

Wagi gamma i beta można trenować we wszystkich warstwach normalizacji, aby zrekompensować możliwą utratę zdolności reprezentacyjnych. Można włączyć te czynniki poprzez ustawienie center lub scale flagę na True . Oczywiście można użyć initializers , constraints i regularizer dla beta i gamma , aby dostroić te wartości w trakcie procesu treningowego.

Ustawiać

Zainstaluj Tensorflow 2.0 i dodatki Tensorflow

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

Przygotowywanie zbioru danych

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

Samouczek normalizacji grup

Wstęp

Normalizacja grupowa (GN) dzieli kanały danych wejściowych na mniejsze podgrupy i normalizuje te wartości na podstawie ich średniej i wariancji. Ponieważ GN działa na jednym przykładzie, ta technika jest niezależna od wielkości partii.

GN eksperymentalnie uzyskał wynik zbliżony do normalizacji wsadowej w zadaniach klasyfikacji obrazów. Korzystne może być użycie GN zamiast normalizacji wsadowej w przypadku, gdy ogólny rozmiar wsadu jest niski, co prowadziłoby do złej wydajności normalizacji wsadowej

Przykład

Podział 10 kanałów po warstwie Conv2D na 5 podgrup w standardowym ustawieniu „ostatnie kanały”:

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>

Samouczek normalizacji instancji

Wstęp

Normalizacja instancji jest szczególnym przypadkiem normalizacji grupy, w której rozmiar grupy jest taki sam jak rozmiar kanału (lub rozmiar osi).

Wyniki eksperymentalne pokazują, że normalizacja instancji działa dobrze przy przenoszeniu stylu podczas zastępowania normalizacji wsadowej. Ostatnio normalizacja instancji została również wykorzystana jako zamiennik normalizacji wsadowej w GAN.

Przykład

Zastosowanie InstanceNormalization po warstwie Conv2D i użycie ujednoliconej zainicjowanej skali i współczynnika przesunięcia.

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>

Samouczek normalizacji warstw

Wstęp

Normalizacja warstw jest szczególnym przypadkiem normalizacji grupowej, gdzie wielkość grupy wynosi 1. Średnia i odchylenie standardowe są obliczane ze wszystkich aktywacji pojedynczej próbki.

Wyniki eksperymentalne pokazują, że normalizacja warstw jest dobrze dopasowana do rekurencyjnych sieci neuronowych, ponieważ działa niezależnie od wielkości partii.

Przykład

Stosowanie normalizacji warstw po warstwie Conv2D i używanie współczynnika skali i przesunięcia.

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>

Literatura

Norma warstw

Instancja norma

Grupa Norma