keras.layers.Batchnomalization如何工作?

时间:2019-04-24 02:33:11

标签: python keras batch-normalization

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

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

但是,我的layer(axis = 0)和layer(axis = 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]]
如trainable_weights所示,

gamma = 1和beta = 0。那么这层如何工作?

1 个答案:

答案 0 :(得分:2)

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

它的作用是:在训练神经网络的过程中,它会将您的输出从某层转换为下一层的归一化输入,从而有助于训练下一层的权重。我不是kerns用户,但我想您可能仅通过直接检查tensorflow节点(如果有)就可以检查某些层的规范化输出

要回答您的问题的标题,批次规范化本身就是standard z-score normalization。 它等于减去平均值并除以序列的标准偏差。

以数学符号表示,

enter image description here

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

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

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

最近已讨论过(例如herehere),通过对批次进行重新规格化,您可以通过减少内部协变量偏移来更快地训练神经网络。