簡體   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