Google I / O возвращается 18-20 мая! Зарезервируйте место и составьте свое расписание Зарегистрируйтесь сейчас
Эта страница переведена с помощью Cloud Translation API.
Switch to English

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

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

Обзор

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

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

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

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

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

$ y $: Вывод

$ x $: ввод

$ \ gamma $: масштабный коэффициент

$ \ mu $: среднее

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

$ \ beta $: коэффициент смещения

Следующее изображение демонстрирует разницу между этими методами. Каждый подзаголовок показывает входной тензор с 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 -q -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 [==============================] - 4s 3ms/step - loss: 0.7835 - accuracy: 0.7722

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

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

Вступление

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

Экспериментальные результаты показывают, что нормализация экземпляра хорошо работает при передаче стиля при замене пакетной нормализации. В последнее время нормализация экземпляров также используется в качестве замены пакетной нормализации в 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 [==============================] - 2s 3ms/step - loss: 0.9159 - accuracy: 0.7194

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

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

Вступление

Слойная нормализация - это частный случай групповой нормализации, где размер группы равен 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.6272 - accuracy: 0.8049

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

Литература

Норма слоя

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

Группа Норма

Полный обзор нормализации