tf.math.round() с определенным десятичным знаком? Тензорный поток Python

avatar
Vitor Bento
8 августа 2021 в 23:21
281
1
0

Мне нужен тензор, состоящий из чисел, округленных до 3 знаков после запятой:

Например, мне нужно, чтобы 0,9989 стало 0,999.

Вот хороший ответ, но мне он не подходит. Я не знаю, почему это не работает в Tensorflow 2.0

tf.round() с указанной точностью

мой код:

max_per_dim_rede1=tf.cast(max_per_dim_rede1 ,tf.float32)
max_per_dim_rede2=tf.cast(max_per_dim_rede2 ,tf.float32)

max_per_dim_rede1=my_tf_round(max_per_dim_rede1)
max_per_dim_rede1=my_tf_round(max_per_dim_rede1)



def my_tf_round(x, decimals = 3):
    multiplier = tf.constant(10**decimals, dtype=x.dtype)
    return tf.math.round(x * multiplier) / multiplier

Перед раундом:

 max_per_dim_rede1 [0.379137 0.566415608 0.653300881 0.386984855 0.567309678 0.49462229 0.360385835 0.485670954 0.719773293 0.32398814 0.683747768 0.340885848 ... 0.427117109 0.309505373 0.265250593 0.614662766 0.750278294 0.634733856 0.55743891 0.852669597 0.525657892 0.619692624 0.463500887 0.319094926]

    max_per_dim_rede2 [0.391448647 0.549464703 0.353492677 0.287505835 0.481978029 0.636479914 0.510595262 0.811914325 0.548603892 0.396977246 0.697723746 0.374327421 ... 0.464759499 0.243383855 0.181745842 0.393151551 0.560529053 0.756349742 0.509183 0.897165596 0.440935612 0.386274785 0.746069133 0.240405202]

После раунда:

 max_per_dim_rede1 [0.379 0.566000044 0.653000057 0.387000024 0.567000031 0.495000035 0.36 0.486000031 0.72 0.324 0.684 0.341000021 ... 0.427000016 0.31 0.265000015 0.615 0.75000006 0.63500005 0.557000041 0.853000045 0.526 0.62 0.464000016 0.319]
    max_per_dim_rede2 [0.391448647 0.549464703 0.353492677 0.287505835 0.481978029 0.636479914 0.510595262 0.811914325 0.548603892 0.396977246 0.697723746 0.374327421 ... 0.464759499 0.243383855 0.181745842 0.393151551 0.560529053 0.756349742 0.509183 0.897165596 0.440935612 0.386274785 0.746069133 0.240405202]

Как видите, одни случаи работают, а другие нет. Кто-нибудь знает почему?

Источник
Nicolas Gervais
8 августа 2021 в 23:42
0

это работает, но точность с плавающей запятой ограничена. может попробовать с tf.float64?

Vitor Bento
8 августа 2021 в 23:46
0

Я пытаюсь: max_per_dim_rede1=tf.cast(max_per_dim_rede1, tf.float64) max_per_dim_rede2=tf.cast(max_per_dim_rede2, tf.float64) , но получаются те же результаты.

Ответы (1)

avatar
Tomasz Kalisiak
8 августа 2021 в 23:41
2

Вы не можете представить то, что хотите, с помощью чисел с плавающей запятой. Они не могут хранить такое точное число, у них ограниченная точность. То, что вы видите, — это самое близкое, что вы можете получить. Вы можете настроить их только для отображения с некоторым форматированием.

Vitor Bento
8 августа 2021 в 23:50
0

Для меня это нормально, если операция не совсем точна, так что в процессе теряется некоторая точность. я просто не умею? Я не хочу просто печатать. Мне нужно сделать некоторые операции с тензором позже. Я имею в виду, что мне нужно сравнить оба позже.

Tomasz Kalisiak
9 августа 2021 в 00:49
1

Вам нужно понимать разницу между арифметикой с плавающей запятой и арифметикой с фиксированной запятой (в Википедии есть статьи об обоих). Потеря точности означает, что число вроде 0,999 может быть непредставимо. Обычно не следует проверять равенство между числами с плавающей запятой. Выражения, которые математически должны давать один и тот же результат, могут отличаться при вычислении с плавающей запятой. Установите некоторый предел погрешности и вместо этого используйте его как «приблизительно равный».

Tomasz Kalisiak
9 августа 2021 в 01:00
0

Это может быть полезно: coderhelper.com/questions/5595425/…