Как правильно округлить половину с помощью тензорного потока - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь реплицировать некоторый код на основе C ++ в Python API Tensorflow, но у меня мало проблем с плавающей запятой, хотя мне удалось найти одну из них.

Как правило, Tensorflowкажется, округляет десятичные дроби округлить наполовину вниз способом, это означает, что если у нас есть целое число с дробным значением, точно равным 0.5, интегральная часть этого десятичного числа будет округлена до нуля:

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

тогда как многие императивные языки программирования, с которыми я сталкивался, выполняют округление с округлением до половины .Некоторые из этих языков программирования: C ++ и Python .

На самом деле, учитывая, что Tensorflow в основном написан на C ++, Python и Cuda C ++, для них кажется странным соглашением использовать метод rounding half down для своих функций в API.


Вопрос :

Есть ли какой-нибудь удобный способ реализовать функцию округления, которая использует метод 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

Это достаточно точный метод?или что-то подобное можно сделать с помощью других операций с тензорным потоком?

Research :

Я мог только найти эту проблему Github , относящуюся к моей проблеме,Я думаю, что они закончили тем, что добавили tf.math.rint, для которого я не мог найти место в этой проблеме.

Спасибо!

1 Ответ

0 голосов
/ 22 февраля 2019

призвал банкиров не округлять ничего плохого в том же, что происходит и в 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

...