keras BatchNormalization
layer使用axis=-1
作为默认值,并指出特征轴通常已标准化。为什么会这样呢?
我想这是令人惊讶的,因为我更熟悉使用类似于 StandardScaler
的东西,这等效于使用axis=0
。这将使各个功能正常化。
是否有原因默认将样本在keras中而不是在特征中分别进行归一化(即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:
this paper中第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个均值吗? 最佳答案
造成混淆的原因是axis
与np.mean
中BatchNormalization
的含义。
当我们沿轴取均值时,我们会折叠该维度并保留所有其他维度。在您的示例中,data.mean(axis=0)
折叠了0-axis
,它是data
的垂直尺寸。
当我们沿着一个轴计算BatchNormalization
时,我们保留了数组的维数,并且针对每条其他轴的均值和标准差进行归一化。因此,在您的2D
示例中,带有BatchNormalization
的axis=1
会减去axis=0
的平均值,正如您所期望的那样。这就是bn.moving_mean
具有形状(4,)
的原因。
关于python - keras BatchNormalization轴说明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47538391/