Слой keras BatchNormalization
использует axis=-1
в качестве значения по умолчанию и утверждает, что ось объекта обычно нормализована. Почему это так?
Я полагаю, это удивительно, потому что я более знаком с использованием чего-то вроде StandardScaler
, что было бы эквивалентно использованию axis=0
. Это нормализует функции индивидуально.
Есть ли причина, по которой выборки по умолчанию индивидуально нормализуются (т.е. axis=-1
) в кератах, а не по функциям?
Изменение: пример для конкретности
Обычно данные преобразуются таким образом, что каждый объект имеет нулевое среднее значение и единичную дисперсию. Давайте просто рассмотрим часть с "нулевым средним" в этом фиктивном наборе данных, где каждая строка является выборкой:
>>> data = np.array([[ 1, 10, 100, 1000],
[ 2, 20, 200, 2000],
[ 3, 30, 300, 3000]])
>>> data.mean(axis=0)
array([ 2., 20., 200., 2000.])
>>> data.mean(axis=1)
array([ 277.75, 555.5 , 833.25])
Не имеет ли больше смысла вычитать среднее значение axis=0
, а не среднее axis=1
? Используя axis=1
, единицы измерения и шкалы могут быть совершенно разными.
Изменить 2:
Первое уравнение раздела 3 в этой статье, по-видимому, подразумевает, что axis=0
следует использовать для расчета ожиданий и отклонений для каждого элемента в отдельности, предполагая, что у вас есть (m, n) -образный набор данных, где m - это количество образцов, а n - это число признаков.
Изменить 3: еще один пример
Я хотел увидеть размеры средних и отклонений, которые BatchNormalization
рассчитывал на наборе игрушечных данных:
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from keras.optimizers import Adam
from keras.models import Model
from keras.layers import BatchNormalization, Dense, Input
iris = load_iris()
X = iris.data
y = pd.get_dummies(iris.target).values
input_ = Input(shape=(4, ))
norm = BatchNormalization()(input_)
l1 = Dense(4, activation='relu')(norm)
output = Dense(3, activation='sigmoid')(l1)
model = Model(input_, output)
model.compile(Adam(0.01), 'categorical_crossentropy')
model.fit(X, y, epochs=100, batch_size=32)
bn = model.layers[1]
bn.moving_mean # <tf.Variable 'batch_normalization_1/moving_mean:0' shape=(4,) dtype=float32_ref>
Вход X имеет форму (150, 4), а слой BatchNormalization
рассчитан по 4 средним значениям, что означает, что он работал над axis=0
.
Если BatchNormalization
имеет значение по умолчанию axis=-1
, тогда не должно ли быть 150 средних?