【问题标题】:How keras.layers.Batchnomalization works?keras.layers.Batchnormalization 是如何工作的?
【发布时间】:2019-09-13 06:00:40
【问题描述】:

我尝试对玩具集 [[1,2],[5,4] 进行批量标准化。 在axis=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]]

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

【问题讨论】:

  • 这是this的副本

标签: python keras batch-normalization


【解决方案1】:

这只是一个没有神经元的玩具模型。这里没有优化。批量标准化不会更改您的 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)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2016-11-13
    • 2017-10-11
    • 2021-10-13
    • 2011-02-24
    • 2013-11-16
    • 2011-10-16
    相关资源
    最近更新 更多