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_mean、moving_variance、beta 和 gamma .它们被初始化为 beta=0、gamma=1、moving_mean=0 和 moving_variance=1。由于您没有任何训练步骤,因此 BatchNorm 不会更改您的值。
那么,为什么不准确地获得输入值呢?因为还有另一个参数 epsilon(一个小数字),它被添加到方差中。因此,所有值都除以 1+epsilon 并最终低于其输入值。
【讨论】:
我还是不明白为什么输入值没有改变。在规范化中,我得到 [-1, -1] 和 [1,1],即使它乘以 gamma 并添加 beta,我也无法得到相同的数字。另外,我尝试了 batch_size = 4 和 4 个随机输入向量,但我仍然得到相同的数字。 BatchNormalization 不像您那样计算均值和方差,但这些是(常数)参数。由于您没有训练这一层,它们的初始值仍然是均值 = 0 和方差 = 1。以上是关于keras 中的 BatchNormalization 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章
keras 中的 BatchNormalization 是如何工作的?