keras^{} layer使用axis=-1作为默认值,并声明特征轴通常是标准化的。为什么是这个案子?
我想这很奇怪,因为我更熟悉使用^{},这相当于使用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 #
输入X具有形状(150,4),并且BatchNormalization层计算出4个平均值,这意味着它在axis=0上操作。
如果BatchNormalization的默认值是axis=-1,那么不应该有150个方法吗?