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),通过重新归一化您的批次,您可以通过减少内部协变量偏移来更快地训练您的神经网络。
我尝试了玩具套装 [[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),通过重新归一化您的批次,您可以通过减少内部协变量偏移来更快地训练您的神经网络。