Нормализации

Посмотреть на TensorFlow.org Запускаем в Google Colab Посмотреть исходный код на GitHub Скачать блокнот

Обзор

Этот ноутбук дает краткое введение в нормализации слои из TensorFlow. В настоящее время поддерживаются следующие слои:

  • Группа Нормализация (TensorFlow аддонов)
  • Нормализация экземпляра (TensorFlow добавление)
  • Слой Нормализация (TensorFlow ядро)

Основная идея, лежащая в основе этих уровней, - нормализовать выходные данные слоя активации для улучшения сходимости во время обучения. В отличии от пакетной нормализации этих нормировки не работают на партии, вместо этого они нормализуют активации одного образца, что делает их пригодными для рецидивирующих neual сетей.

Обычно нормализация выполняется путем вычисления среднего значения и стандартного отклонения подгруппы во входном тензоре. Также к этому можно применить масштаб и коэффициент смещения.

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

\( y\) : Выходной

\(x\) : Вход

\(\gamma\) : Масштабный коэффициент

\(\mu\): среднее

\(\sigma\): стандартное отклонение

\(\beta\): Offset фактор

Следующее изображение демонстрирует разницу между этими методами. Каждый подзаголовок показывает входной тензор с N в качестве оси пакета, C в качестве оси канала и (H, W) в качестве пространственных осей (например, высота и ширина изображения). Пиксели, выделенные синим цветом, нормализованы по тем же среднему значению и дисперсии, вычисляемым путем агрегирования значений этих пикселей.

Источник: ( https://arxiv.org/pdf/1803.08494.pdf )

Гамма и бета весов обучаются на всех уровнях нормализации, чтобы компенсировать возможную потерю репрезентативной способности. Вы можете активировать эти факторы, установив center или scale флаг в значение True . Конечно , вы можете использовать initializers , constraints и regularizer для beta и gamma , чтобы настроить эти значения в процессе обучения.

Настраивать

Установите Tensorflow 2.0 и Tensorflow-Addons

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

Подготовка набора данных

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

Учебник по нормализации группы

Вступление

Групповая нормализация (GN) делит каналы ваших входных данных на более мелкие подгруппы и нормализует эти значения на основе их среднего значения и дисперсии. Поскольку GN работает на одном примере, этот метод не зависит от размера партии.

GN экспериментально закрыла для себя пакетную нормализацию в задачах классификации изображений. Может быть полезно использовать GN вместо пакетной нормализации, если ваш общий размер batch_size низкий, что приведет к плохой производительности пакетной нормализации.

Пример

Разделение 10 каналов после слоя Conv2D на 5 подгрупп в стандартной настройке «каналы последние»:

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>

Учебное пособие по нормализации экземпляра

Вступление

Нормализация экземпляра - это частный случай нормализации группы, когда размер группы совпадает с размером канала (или размером оси).

Экспериментальные результаты показывают, что нормализация экземпляра хорошо работает при передаче стиля при замене пакетной нормализации. В последнее время нормализация экземпляров также используется в качестве замены пакетной нормализации в GAN.

Пример

Применение InstanceNormalization после слоя Conv2D и использование унифицированного инициализированного масштаба и коэффициента смещения.

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>

Учебник по нормализации слоев

Вступление

Слойная нормализация - это частный случай групповой нормализации, когда размер группы равен 1. Среднее значение и стандартное отклонение рассчитываются по всем активациям одного образца.

Экспериментальные результаты показывают, что нормализация уровня хорошо подходит для рекуррентных нейронных сетей, поскольку она работает независимо от размера партии.

Пример

Применение Layernormalization после Conv2D Layer и использование коэффициента масштабирования и смещения.

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>

Литература

Норма слоя

Норма экземпляра

Группа Норма