keras.layers.Batchnomalization 是如何运作的?

How keras.layers.Batchnomalization works?

我尝试了玩具套装 [[1,2],[5,4] 的批量归一化。 在 axis=0 之间归一化,我们得到

#[[-1/sqrt(2),-1/sqrt(2)],[1/sqrt(2), 1/sqrt(2)]]

但是,我的图层(轴=0)和图层(轴=1)都给出了错误的结果。

X = tf.constant([[1,2],[5,4]],dtype = tf.float32)
layer = keras.layers.BatchNormalization()
hidden = layer(X)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer(axis=0))
    print(sess.run(layer.trainable_weights))
    print(sess.run(hidden))

#results
#[array([1., 1.], dtype=float32), array([0., 0.], dtype=float32)]
#[[0.9995004 4.997502 ]
# [1.9990008 3.9980016]]


X = tf.constant([[1,2],[5,4]],dtype = tf.float32)
layer = keras.layers.BatchNormalization()
hidden = layer(X)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer(axis=1))
    print(sess.run(layer.trainable_weights))
    print(sess.run(hidden))

#results
#[array([1., 1.], dtype=float32), array([0., 0.], dtype=float32)]
#[[0.9995004 4.997502 ]
# [1.9990008 3.9980016]]

gamma=1 和 beta=0,如 trainable_weights 所示。那么这一层是如何工作的呢?

这只是一个没有神经元的玩具模型。这里没有进行优化。批量规范化不会更改您的 X 变量,因为根据定义它是一个常量。

它的作用是:在训练神经网络的过程中,它将你的某个层的输出转换为规范化输入下一层,这样它有助于训练下一层的权重。我不是 kerns 用户,但我猜你可能只能通过直接检查 tensorflow 节点来检查某个层的规范化输出(如果那时)

要回答您的问题标题,批量归一化本身就是 standard z-score normalization。 它与减去平均值并除以系列的标准偏差相同。

在数学符号中,

在代码中,arr是一个numpy数组,

(arr - arr.mean(axis=0))/arr.std(axis=0, ddof=1)

归一化的想法是让你的分布更接近标准正态分布,均值为 0,标准差为 1,即 ~ N(0,1)。

最近有人讨论(例如 here and here),通过重新归一化您的批次,您可以通过减少内部协变量偏移来更快地训练您的神经网络。