为什么tf.matmul()给出看似不一致的结果?

时间:2016-10-31 10:43:08

标签: tensorflow

sess = tf.InteractiveSession()
num_elements = 10
output = [[0.76158798] * num_elements]
softmax_w = [[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]] * num_elements
print(tf.matmul(output, softmax_w).eval())

给出

[[ 0.76158804  0.76158804  0.76158804  0.76158804  0.76158804  0.76158804 0.76158804]]

将num_elements更改为50

sess = tf.InteractiveSession()
num_elements = 50
output = [[0.76158798] * num_elements]
softmax_w = [[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]] * num_elements
print(tf.matmul(output, softmax_w).eval())

给出

[[ 3.80794024  3.80794024  3.80794024  3.80794024  3.80793881  3.80793881 3.80793881]]

为什么第二个例子中结果矩阵中的元素不完全相同?

我正在使用张量流0.11.0rc0

2 个答案:

答案 0 :(得分:1)

我认为这是因为你的行长度(7)不是适合SSE寄存器的浮点数的整数倍。对于更大的示例,输出的前4个元素使用矢量化代码路径计算,而后3个元素在标量“清理”循环中计算。在代码的矢量化和标量版本中执行的浮点加法的顺序可能略有不同,并且由于浮点加法不是关联的,所以

的顺序略有不同
num_elements * std::numeric_limits<float>::epsilon() * std::abs(result)

发生。

答案 1 :(得分:0)

似乎是由数字错误引起的。我的代码得到了相同的结果,但后来我将outputsoftmax_w设置为float64张量,问题就消失了:

sess = tf.InteractiveSession()
num_elements = 50
output = tf.convert_to_tensor([[0.76158798] * num_elements], dtype = tf.float64)
softmax_w = tf.convert_to_tensor([[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]] * num_elements, dtype = tf.float64)
print(tf.matmul(output, softmax_w).eval())