Как работает keras.layers.Batchnomalization?

Я пробовал пакетную нормализацию для набора игрушек [[1,2],[5,4]. Нормируя среди оси = 0, мы получаем

#[[-1/sqrt(2),-1/sqrt(2)],[1/sqrt(2), 1/sqrt(2)]]

Однако мой слой (ось = 0) и слой (ось = 1) дают неверный результат.

X = tf.constant([[1,2],[5,4]],dtype = tf.float32)
layer = keras.layers.BatchNormalization()
hidden = layer(X)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer(axis=0))
    print(sess.run(layer.trainable_weights))
    print(sess.run(hidden))

#results
#[array([1., 1.], dtype=float32), array([0., 0.], dtype=float32)]
#[[0.9995004 4.997502 ]
# [1.9990008 3.9980016]]


X = tf.constant([[1,2],[5,4]],dtype = tf.float32)
layer = keras.layers.BatchNormalization()
hidden = layer(X)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer(axis=1))
    print(sess.run(layer.trainable_weights))
    print(sess.run(hidden))

#results
#[array([1., 1.], dtype=float32), array([0., 0.], dtype=float32)]
#[[0.9995004 4.997502 ]
# [1.9990008 3.9980016]]

гамма=1 и бета=0, как показывает обучаемый_вес. Тогда как этот слой работает?


person CSH    schedule 24.04.2019    source источник
comment
Это дубликат этого.   -  person CSH    schedule 25.04.2019


Ответы (1)


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

Что он делает: в процессе обучения нейронной сети он преобразует ваши выходные данные с некоторого слоя в нормализованные входные данные для следующего слоя, чтобы помочь в обучении следующего. вес слоя. Я не являюсь пользователем kerns, но я думаю, вы сможете проверить нормализованные выходные данные некоторого слоя, только проверив узлы тензорного потока напрямую (если тогда)

Чтобы ответить на заголовок вашего вопроса, пакетная нормализация сама по себе является просто стандартной нормализацией z-оценки. Это то же самое, что вычесть среднее и разделить на стандартное отклонение ряда.

В математической записи

введите здесь описание изображения

В коде, где arr — это пустой массив,

(arr - arr.mean(axis=0))/arr.std(axis=0, ddof=1)

Идея нормализации состоит в том, чтобы приблизить ваше распределение к стандартной нормальности со средним значением 0 и стандартным отклонением 1, то есть ~ N (0,1).

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

person rafaelc    schedule 24.04.2019