python - keras BatchNormalization 轴说明

标签 python machine-learning deep-learning keras

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=1 均值相比,减去 axis=0 均值不是更有意义吗?使用 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 种方法吗?

最佳答案

混淆是由于 np.meanBatchNormalization 中的 axis 的含义。

当我们沿轴取平均值时,我们折叠该维度并保留所有其他维度。在您的示例中,data.mean(axis=0) 折叠了 0 轴,这是 data 的垂直维度。

当我们沿轴计算 BatchNormalization 时,我们会保留数组的维度,并根据每隔一个轴 的均值和标准差进行归一化。因此,在您的 2D 示例 BatchNormalization 中,axis=1 减去 axis=0< 的平均值,如你所料。这就是为什么 bn.movi​​ng_mean 具有 (4,) 的形状。

关于python - keras BatchNormalization 轴说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47538391/

相关文章:

python - 字典:如何列出包含某个值的每个关键路径?

machine-learning - 在 deeplearning4j 中初始化自定义权重

python - Tensorflow 分层样本错误

python - UnpicklingError : A load persistent id instruction was encountered, 但没有指定persistent_load 函数

tensorflow - 如何在TensorFlow GRU模型中添加Attention层?

python - Pandas dataframe,每个单元格都进入列表 - 更pythonic的方式?

python - 如何将石头、布、剪刀、游戏的分数保存在外部文本文件中?

python - 霍尔分区算法的解释

linux - tensorflow 和 openSUSE

python - 使用 LSTM 神经网络和 Keras 预测天气数据