我正在尝试将一些基于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,但我找不到在该问题中的位置。

谢谢!

最佳答案

所谓的银行家也对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

关于python - 如何使用 tensorflow 准确舍入一半,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54816173/

10-11 02:03