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>