Как нормализовать все оси с пакетной нормализацией? - PullRequest
0 голосов
/ 16 апреля 2019

Насколько я понимаю, для tf.layers.batch_normalization определяемая мной ось является осью, которая нормализуется.

Проще говоря:

С учетом этих значений

a = [[0, 2], 
     [1, 4]]

с формой (2, 2) и, следовательно, с осями 0 и 1.

Нормализация по оси 1 будет означать уменьшение оси 0 до ее среднего и стандартного отклонения, а затем принять эти значения для нормализации.

Поэтому

bn = tf.layers.batch_normalization(a, axis=[1])

будет иметь (почти) тот же результат, что и

m, v = tf.nn.moments(a, axes=[0])
bn = (a - m) / tf.sqrt(v)

Но как бы я сделал tf.layers.batch_normalization для всех осей?

Свычисление среднего и стандартного отклонения от этого было бы легко:

m, v = tf.nn.moments(a, axes=[0, 1])
bn = (a - m) / tf.sqrt(v)

Но как это сделать с нормализацией партии?

bn = tf.layers.batch_normalization(a, axis=[???])

Я пробовал следующее, которое не работает:

  • axis = None: AttributeError: 'BatchNormalization' object has no attribute 'axis'
  • axis = []: IndexError: list index out of range
  • axis = [0, 1]: все результаты равны нулю

1 Ответ

0 голосов
/ 16 апреля 2019

К сожалению, я не думаю, что это осуществимо с использованием batch_normalization слоев / функции API-интерфейса tenorflow.

Как следует из названия функции, она предназначена для нормализации "партии", поэтому она должна нормализоваться по оси объектов с учетом текущей партии (обычно размер 0).

...