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