keras BatchNormalization轴澄清

tri*_*ta2 11 python machine-learning deep-learning keras

所述keras BatchNormalization使用axis=-1作为缺省值和指出该特征轴通常是标准化的.为什么会这样?

我认为这是令人惊讶的,因为我更熟悉使用类似的东西StandardScaler,这相当于使用axis=0.这将单独规范化功能.

有没有理由为什么样本默认(即axis=-1)在keras 中单独归一化而不是特征?

编辑:具体的例子

转换数据是很常见的,因此每个要素的均值和单位方差均为零.让我们只考虑这个模拟数据集的"零均值"部分,其中每一行都是一个样本:

>>> 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])
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

输入X具有形状(150,4),并且BatchNormalization计算的层4表示,这意味着它操作axis=0.

如果BatchNormalization有默认值axis=-1则不应该有150个手段?

Imr*_*ran 16

混淆是由于axisin np.meanin 的意思BatchNormalization.

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

当我们BatchNormalization沿着轴计算a时,我们保留数组的尺寸,并且我们相对于每个其他轴的平均值和标准偏差进行归一化.因此,在你的2D例子BatchNormalizationaxis=1 扣除平均的axis=0,就像你期望的那样.这就是bn.moving_mean造型的原因(4,).


Bol*_*ine 15

我知道这篇文章很旧,但我仍在回答它,因为 Keras 文档中仍然存在混淆。我不得不通过代码来弄清楚这一点:

  1. 记录为整数的轴变量实际上可以是表示多个轴的整数列表。因此,例如,如果我的输入具有 NHWC 或 NCHW 格式的图像,如果我想以 OP 想要的方式执行 BatchNormalization(即仅跨批次维度标准化),请提供 axis=[1,2,3] 。
  2. 轴列表(或整数)应包含您不想要的轴在计算均值和方差时减少。换句话说,它是您想要标准化的轴的补充 - 如果您遵循“轴”的传统定义,则与文档似乎所说的完全相反。因此,例如,如果您的输入 I 的形状为 (N,H,W,C) 或 (N,C,H,W) - 即第一个维度是批次维度,您只希望计算平均值和方差您应该提供的批次维度 axis=[1,2,3]。这将导致 Keras 分别计算形状为 (1,H,W,C) 或 (1,C,H,W) 的均值 M 和方差 V 张量 - 即批次维度将因聚合而被边缘化/减少(即均值或跨第一维计算方差)。在后面的操作中,例如 (IM) 和 (IM)/V,
  3. 在这个例子中,BatchNorm 层最终调用了 tf.nn.moments,轴 =(1,)!这是因为 tf.nn.moments 中轴的定义是正确的。
  4. 类似地,tf.nn.moments 调用 tf.nn.reduce_mean,其中轴的定义也是正确的(即与 tf.keras.layers.BatchNormalization 相反)。
  5. 也就是说,BatchNormalization 论文建议除了批量维度 (N) 之外,还要对 HxW 空间图进行标准化。因此,如果要遵循该建议,那么轴将仅包含通道维度 (C),因为这是您不想减少的唯一剩余维度。Keras 文档可能暗示了这一点,尽管它很神秘。


小智 8

如果您的小批量是矩阵A mxn,即m 个样本和n 个特征,则归一化轴应为axis=0。正如您所说,我们想要的是单独标准化每个特征,keras 中的默认轴 = -1因为在卷积层中使用时,图形数据集的维度通常是(samples, width, height, channal),并且批次样本沿通道轴(最后一个轴)进行标准化。