- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我尝试比较 tf.nn.fused_batch_norm 的方差输出和 tf.nn.moments 的方差输出时,对于相同的输入,我没有相同的值。
import numpy as np
import tensorflow as tf
tf.reset_default_graph()
inputs = tf.placeholder(shape=[None,4,4,1], dtype=tf.float32)
mean1, var1 = tf.nn.moments(inputs, [0,1,2])
_, mean2, var2 = tf.nn.fused_batch_norm( \
inputs, scale=[1.], offset=[0.], \
mean=None, variance=None, epsilon=1e-5, \
data_format='NHWC', is_training=True, \
name='reference')
val = np.random.rand(1,4,4,1)
mean3 = tf.reduce_mean(inputs, [0, 1, 2])
mean_sq3 = tf.reduce_mean(tf.square(inputs), [0, 1, 2])
var3 = mean_sq3 - tf.square(mean3)
var_eps1 = var3 + 1e-5
var_eps2 = var3 + np.sqrt(1e-5)
with tf.Session() as sess:
mean_val, var_val = sess.run([mean1, var1], {inputs:val})
print "tf.nn.moments: mean:", mean_val, "| var:", var_val
mean_val, var_val = sess.run([mean2, var2], {inputs:val})
print "tf.nn.fused_batch_norm: mean:", mean_val, "| var:", var_val
mean_val, var_val, var_eps1_val, var_eps2_val = sess.run([mean3, var3, var_eps1, var_eps2], {inputs:val})
print "customs: mean:", mean_val, "| var:", var_val, "| var + eps:", var_eps1_val, "| var + sqrt(eps):", var_eps2_val
你可以看到我试图检查它是否与 epsilon 有关,但显然不是,因为在 GPU 上运行的脚本返回这个(它是随机的,但问题总是发生):
tf.nn.moments: mean: [ 0.54445559] | var: [ 0.09011541]
tf.nn.fused_batch_norm: mean: [ 0.54445559] | var: [ 0.09612311]
customs: mean: [ 0.54445559] | var: [ 0.09011537] | var + eps: [ 0.09012537] | var + sqrt(eps): [ 0.09327765]
正如您所看到的,tf.nn.fused_batch_norm 的方差高于 tf.nn.moments 的方差(即使在添加 sqrt(epsilon) 后)
知道为什么会有这样的差异吗? (我不认为>5%很小,而且看起来也不像是数值精度问题)
最佳答案
tf.nn.moments
正在计算样本方差,而 tf.nn.fused_batch_norm
正在计算无偏方差估计量。两者之间的差异是一个因子 n/n-1
,其中 n
是样本大小。应用此因子的代码可以找到 here .
但请注意,虽然返回的方差是无偏估计,但用于移动平均值的保存方差是有偏方差。
在您的示例中,您的样本大小为 4*4*1=16
,您会注意到 var2 = var1 * 16/15
。
当您获取更大的样本时,您会发现 var1
和 var2
之间的差异变得更小。
这可能值得在文档中提及。
关于tensorflow - tf.nn.fused_batch_norm 返回的方差与 tf.nn.moments 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44808838/
我需要一些简单的示例,通过这些示例我可以学习如何使用 tf.nn.fused_batch_norm。 (我通过谷歌搜索找不到。) 具体来说,我想准确理解函数中的输入部分mean=None, varia
当我尝试比较 tf.nn.fused_batch_norm 的方差输出和 tf.nn.moments 的方差输出时,对于相同的输入,我没有相同的值。 import numpy as np import
当我尝试比较 tf.nn.fused_batch_norm 的方差输出和 tf.nn.moments 的方差输出时,对于相同的输入,我没有相同的值。 import numpy as np import
我是一名优秀的程序员,十分优秀!