如何使用张量流准确舍入一半

时间:2019-02-21 21:02:48

标签: python c++ tensorflow floating-point rounding

我正在尝试将一些基于C ++的代码复制到Tensorflow的Python API中,但是我几乎没有浮点错误问题,尽管我已经找到了其中一个。

通常,Tensorflow似乎以round half down的方式四舍五入,这意味着如果我们有一个整数,其小数值完全等于0.5,则该小数的整数部分将四舍五入为零。 :

>>> import tensorflow as tf
>>> tf.Session().run(tf.math.round(2.5))
2.0

而我遇到的许多命令式编程语言都以round half up的方式进行四舍五入。其中一些编程语言是C++Python

事实上,考虑到Tensorflow主要是用C ++,Python和Cuda C ++编写的,对于他们来说,在API中使用rounding half down方法来实现其功能似乎是一个怪异的约定。


问题

是否有任何巧妙的方法可以实现使用rounding half up方法而不是rounding half down的舍入函数?

我可以实现的最简单的功能是使用tf.floormod方法:

>>> def classical_round(x): return tf.cond(tf.math.equal(tf.floormod(x, 1), tf.constant(0.5)), lambda: tf.math.ceil(x), lambda: tf.math.round(x))
...
>>> tf.Session().run(classical_round(4.5))
5.0
>>> tf.Session().run(classical_round(4.49))
4.0
>>> tf.Session().run(classical_round(4.49999999999999))
5.0
>>> tf.Session().run(classical_round(3.2))
3.0

这是足够准确的方法吗?还是可以通过使用其他张量流操作来完成类似的事情?

研究

我只能找到与问题有关的this Github issue,我认为他们最终添加了tf.math.rint,但我找不到该问题的位置。

谢谢!

1 个答案:

答案 0 :(得分:2)

也称银行家也对C#中发生的同一件事没有任何错误。您可以尝试这样的事情:

def classical_round(x):
    return tf.math.floor(x+0.5)

sess.run(classical_round(2.5)) #3.0

更多信息在这里: https://en.wikipedia.org/wiki/Rounding#Round_half_to_even