Установка режима округления 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.где