我尝试了玩具套件[[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。那么这层如何工作?
答案 0 :(得分:2)
这只是一个没有神经元的玩具模型。这里没有优化。批处理规范化不会更改您的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)。