Tensorflow keras中的批处理规范化是如何工作的?

Tensorflow keras中的批处理规范化是如何工作的?,tensorflow,keras,normalization,Tensorflow,Keras,Normalization,我想知道BatchNormalization在keras中是如何工作的,因此我编写了以下代码: X_input = keras.Input((2,)) X = keras.layers.BatchNormalization(axis=1)(X_input) model1 = keras.Model(inputs=X_input, outputs=X) 输入是一批二维矢量,并沿轴=1对其进行规格化,然后打印输出: a = np.arange(4).reshape((2,2)) print('a=

我想知道BatchNormalization在keras中是如何工作的,因此我编写了以下代码:

X_input = keras.Input((2,))
X = keras.layers.BatchNormalization(axis=1)(X_input)
model1 = keras.Model(inputs=X_input, outputs=X)
输入是一批二维矢量,并沿轴=1对其进行规格化,然后打印输出:

a = np.arange(4).reshape((2,2))
print('a=')
print(a)
print('output=')
print(model1.predict(a,batch_size=2))
输出为:

a=
array([[0, 1],
   [2, 3]])
output=
array([[ 0.        ,  0.99950039],
   [ 1.99900079,  2.9985013 ]], dtype=float32)
我想不出结果。据我所知,批次的平均值应该是([0,1]+[2,3])/2=[1,2],变量是1/2*([0,1]-[1,2])^2+([2,3]-[1,2])^2=[1,1]。最后,用(x-平均值)/sqrt(var)对其进行归一化,因此结果为[-1,-1]和[1,1],我错在哪里?

将减去平均值,除以方差,应用因子γ和偏移β如果这些参数实际上是批次的平均值和方差,结果将以0为中心,方差为1

但事实并非如此。KERA将这些数据存储为可以训练的权重,称为移动平均值、移动方差、β和γ。它们被初始化为beta=0、gamma=1、moving_mean=0和moving_variance=1。由于您没有任何训练步骤,BatchNorm不会更改您的值


那么,为什么不准确地获取输入值呢?因为还有另一个参数epsilon(一个小数字),它被添加到方差中。因此,所有值都除以1+ε,结果比输入值低一点。

我仍然不明白为什么输入值不变。在标准化中,我得到[-1,-1]和[1,1],即使它将gamma和beta相加,我也不能得到相同的数字。另外,我用4个随机输入向量尝试了batch_size=4,但仍然得到了相同的数字。BatchNormalization不像您那样计算均值和方差,但这些是(常量)参数。因为您没有训练该层,所以它们的初始值仍然是均值=0,方差=1。