我正在处理中的小数字
tensorflow
,这有时会导致
数值不稳定性
.
我想提高我的结果的精确度,或者至少
确定我的结果的界限
.
以下代码显示了数字错误的具体示例(它输出
nan
而不是
0.0
因为
float64
不够精确,无法处理
1+eps/2
):
import numpy as np
import tensorflow as tf
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)
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)
? 然后,我可以强制tensorflow总是四舍五入,这将确保我取的是一个非负数的平方根。
我尝试的内容:
我试着跟着
this question
这概述了如何为python/numpy设置舍入模式。但是,这似乎不起作用,因为下面的代码仍在打印
南安
:
import numpy as np
import tensorflow as tf
import ctypes
FE_TONEAREST = 0x0000
FE_DOWNWARD = 0x0400
FE_UPWARD = 0x0800
FE_TOWARDZERO = 0x0c00
libc = ctypes.CDLL('libm.so.6')
libc.fesetround(FE_UPWARD)
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)
with tf.Session() as session:
init = tf.global_variables_initializer()
session.run(init)
ret=session.run(root)
print(ret)