我正在尝试将一些基于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/