Нормализация батча в TensorFlow
Нормализация батча выравнивает
значения внутри партии: для каждого
канала считает среднее и разброс,
приводит карту к более ровному
масштабу. В Keras её задают классом
BatchNormalization.
Во время обучения слой опирается на статистику текущей партии и обновляет накопленные среднее и дисперсию. Подадим одну карту и вызовем слой в режиме обучения:
import tensorflow as tf
tf.keras.utils.set_random_seed(0)
images = tf.constant([[[[1.0, 2.0], [3.0, 4.0]],
[[5.0, 6.0], [7.0, 8.0]]]])
layer = tf.keras.layers.BatchNormalization()
out = layer(images, training=True)
print(out)
Вне обучения слой использует сохранённые среднее и дисперсию, а не пересчитывает их по одной партии. Ответ для тех же данных будет другим. Сначала прогоним партию в режиме обучения, затем повторим с флагом выключенного обучения:
import tensorflow as tf
tf.keras.utils.set_random_seed(0)
images = tf.constant([[[[1.0, 2.0], [3.0, 4.0]],
[[5.0, 6.0], [7.0, 8.0]]]])
layer = tf.keras.layers.BatchNormalization()
train_out = layer(images, training=True)
infer_out = layer(images, training=False)
print(train_out)
print(infer_out)
Форма на выходе совпадает с формой входа: нормализация не меняет размер карты, только значения в ячейках:
import tensorflow as tf
images = tf.constant([[[[1.0], [2.0]],
[[3.0], [4.0]]]])
layer = tf.keras.layers.BatchNormalization()
out = layer(images, training=True)
print(images.shape)
print(out.shape)
Создайте партию из одной карты
2×2 с одним каналом из
чисел 1, 2, 3,
4. Пропустите её через
блок выравнивания в режиме
обучения и выведите форму
ответа.
Задайте одну и ту же карту
1×4 с двумя каналами два
раза через один блок выравнивания:
сначала с включённым обучением,
затем с выключенным. Выведите
оба ответа и сравните их глазами.
Соберите нулевую партию формы
(2, 3, 3, 1). Примените к
ней блок выравнивания в режиме
обучения и выведите форму
результата.