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
答案 0 :(得分:1)
我认为这是因为你的行长度(7)不是适合SSE寄存器的浮点数的整数倍。对于更大的示例,输出的前4个元素使用矢量化代码路径计算,而后3个元素在标量“清理”循环中计算。在代码的矢量化和标量版本中执行的浮点加法的顺序可能略有不同,并且由于浮点加法不是关联的,所以
的顺序略有不同num_elements * std::numeric_limits<float>::epsilon() * std::abs(result)
发生。
答案 1 :(得分:0)
似乎是由数字错误引起的。我的代码得到了相同的结果,但后来我将output
和softmax_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())