繁体   English   中英

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

[英]How to accurately round half up with tensorflow

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

通常,Tensorflow似乎以四舍五入的方式将小数点四舍五入 ,这意味着如果我们有一个分数精确等于0.5的整数,则该小数的整数部分将四舍五入为零:

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

然而,我已经遇到了许多命令式编程语言做的圆角圆半升的方式。 其中一些编程语言是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

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

研究方向

我只能找到与我的问题相关的Github问题,我认为他们最终添加了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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM