Установка режима округления tensorflow

Я работаю с небольшими числами в tensorflow, что иногда приводит к числовой нестабильности.

Я хотел бы увеличить точность моих результатов, или, по крайней мере,определить границы моего результата.

следующий код показывает конкретный пример числовых ошибок (он выводит nan вместо 0.0, потому что float64 недостаточно точно для обработки 1+eps/2):

import numpy as np
import tensorflow as tf

# setup
eps=np.finfo(np.float64).eps
v=eps/2
x_init=np.array([v,1.0,-1.0],dtype=np.float64)

x=tf.get_variable("x", initializer=tf.constant(x_init))
square=tf.reduce_sum(x)
root=tf.sqrt(square-v)

# run
with tf.Session() as session:
    init = tf.global_variables_initializer()
    session.run(init)

    ret=session.run(root)
    print(ret)

Я предполагаю, что есть нет способа увеличить точность значений в tensorflow. Но, возможно, можно установить режим округления, как в C++, используя std::fesetround(FE_UPWARD)? Затем я мог бы заставить тензорный поток всегда округляться, что гарантировало бы, что я беру квадратный корень из неотрицательного числа.


что я пробовал: Я пытался следовать этот вопрос это описывает, как установить режим округления для python/numpy. Однако это, похоже, не работает, потому что следующий код все еще печатает nan:

import numpy as np
import tensorflow as tf

import ctypes
FE_TONEAREST = 0x0000 # these constants may be system-specific
FE_DOWNWARD = 0x0400
FE_UPWARD = 0x0800
FE_TOWARDZERO = 0x0c00
libc = ctypes.CDLL('libm.so.6') # may need 'libc.dylib' on some systems

libc.fesetround(FE_UPWARD)

# setup
eps=np.finfo(np.float64).eps
v=eps/2
x_init=np.array([v,1.0,-1.0],dtype=np.float64)

x=tf.get_variable("x", initializer=tf.constant(x_init))
square=tf.reduce_sum(x)
root=tf.sqrt(square-v)

# run
with tf.Session() as session:
    init = tf.global_variables_initializer()
    session.run(init)
    ret=session.run(root)
    print(ret)

1 ответов


заменить

ret=session.run(root)

С

ret = tf.where(tf.is_nan(root), tf.zeros_like(root), root).eval()

Refer tf.где