Как работает keras.layers.Batchnomalization? - PullRequest
0 голосов
/ 24 апреля 2019

Я пробовал нормализацию партии для игрушечного набора [[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, как показывает trainable_weights. Тогда как этот слой работает?

1 Ответ

2 голосов
/ 24 апреля 2019

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

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

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

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

enter image description here

В коде, где arr - это массив пустых чисел,

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

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

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

...