我正在使用tensorflow-10.0和gpu支持,我想比较2个等式是否返回相同的东西(他们实际上应该)。我将第二个等式简化到两个等式都相等的点,但是断言返回它们不是。
在下面的代码片段b中,c,d是float32张量并在上面计算。
a1 = tf.reduce_sum(-1/2 - 1/2*b + 1/2*tf.exp(c) + 1/2*tf.square(d), 1)
a2 = tf.reduce_sum(-1/2 - 1/2*b + 1/2*tf.exp(c) + 1/2*tf.square(d), 1)
a1 = control_flow_ops.with_dependencies([tf.assert_equal(a1, a2)], a1)
tensorflow.python.framework.errors.InvalidArgumentError:断言 失败:[条件x == y没有按元素持有:x =] [../Sum:0] [0.038984224 0.047407709 0.043144785 ...] [y =] [../Sum_1:0] [0.038984239 0.047407985 0.043144524 ...]
有没有理由,为什么比较两个float32向量会导致断言错误(即使方程是确定性的,并处理相同的值)?两个方程式应该以相同的方式出现舍入误差,或者我错了吗?
提前致谢!
答案 0 :(得分:2)
tf.reduce_sum()
运算符 - 与大多数TensorFlow的reduction operators相同 - 是使用多个线程实现并行执行的减少。但是,由于浮点加法不是associative,并且线程可能以非确定性顺序完成,因此多次聚合相同张量的结果可能不同。当聚合的数字具有较大的动态范围时,误差可能特别大。