我正在尝试找出BatchNormalization层在TensorFlow中的行为方式。我想出了下面这段代码,据我所知应该是一个完全有效的keras模型,但是BatchNormalization的平均值和方差似乎没有被更新。
从文档https://www.tensorflow.org/api_docs/python/tf/keras/layers/BatchNormalization中可以看到:
在BatchNormalization层的情况下,在该层上设置trainable = False意味着该层随后将在推理模式下运行(这意味着它将使用移动平均值和移动方差来规范化当前批次,而不是使用当前批次的平均值和方差)。
我期望模型每次预测调用时返回不同的值。然而,我看到的是10次返回完全相同的值。有人能解释一下为什么BatchNormalization层不会更新其内部值吗?
从文档https://www.tensorflow.org/api_docs/python/tf/keras/layers/BatchNormalization中可以看到:
在BatchNormalization层的情况下,在该层上设置trainable = False意味着该层随后将在推理模式下运行(这意味着它将使用移动平均值和移动方差来规范化当前批次,而不是使用当前批次的平均值和方差)。
我期望模型每次预测调用时返回不同的值。然而,我看到的是10次返回完全相同的值。有人能解释一下为什么BatchNormalization层不会更新其内部值吗?
import tensorflow as tf
import numpy as np
if __name__ == '__main__':
np.random.seed(1)
x = np.random.randn(3, 5) * 5 + 0.3
bn = tf.keras.layers.BatchNormalization(trainable=False, epsilon=1e-9)
z = input = tf.keras.layers.Input([5])
z = bn(z)
model = tf.keras.Model(inputs=input, outputs=z)
for i in range(10):
print(x)
print(model.predict(x))
print()
我使用TensorFlow 2.1.0