keras 中的 BatchNormalization 是如何工作的?

Posted

技术标签:

【中文标题】keras 中的 BatchNormalization 是如何工作的?【英文标题】:How BatchNormalization in keras works? 【发布时间】:2018-05-14 00:57:28 【问题描述】:

我想知道Keras中BatchNormalization是如何工作的,所以我写了代码:

X_input = keras.Input((2,))
X = keras.layers.BatchNormalization(axis=1)(X_input)
model1 = keras.Model(inputs=X_input, outputs=X)

输入是一批二维向量,并沿axis=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],var 是 1/2*(([0,1] - [1,2])^2 + ([2,3]-[1,2])^2) = [1,1]。最后用 (x - mean)/sqrt(var) 对其进行归一化,因此结果是 [-1, -1] 和 [1,1],我哪里错了?

【问题讨论】:

【参考方案1】:

BatchNormalization 将减去均值,除以方差,应用因子 gamma 和偏移 beta。 如果这些参数实际上是批次的均值和方差,则结果将以零为中心,方差为 1。

但他们不是。 keras BatchNormalization layer 将这些存储为可以训练的权重,称为 moving_meanmoving_variancebetagamma .它们被初始化为 beta=0gamma=1moving_mean=0moving_variance=1。由于您没有任何训练步骤,因此 BatchNorm 不会更改您的值。

那么,为什么不准确地获得输入值呢?因为还有另一个参数 epsilon(一个小数字),它被添加到方差中。因此,所有值都除以 1+epsilon 并最终低于其输入值。

【讨论】:

我还是不明白为什么输入值没有改变。在规范化中,我得到 [-1, -1] 和 [1,1],即使它乘以 gamma 并添加 beta,我也无法得到相同的数字。另外,我尝试了 batch_size = 4 和 4 个随机输入向量,但我仍然得到相同的数字。 BatchNormalization 不像您那样计算均值和方差,但这些是(常数)参数。由于您没有训练这一层,它们的初始值仍然是均值 = 0 和方差 = 1。

以上是关于keras 中的 BatchNormalization 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

keras 中的 BatchNormalization 是如何工作的?

keras 中的 preprocess_input() 方法

Keras 中的 tensorflow 会话在哪里

Keras中的LSTM

Keras 中的“细胞类”是啥?

Keras 中的“无法解释优化器标识符”错误