代码之家  ›  专栏  ›  技术社区  ›  Peter

设置tensorflow取整模式

  •  10
  • Peter  · 技术社区  · 7 年前

    我正在处理中的小数字 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) ? 然后,我可以强制tensorflow总是四舍五入,这将确保我取的是一个非负数的平方根。


    我尝试的内容: 我试着跟着 this question 这概述了如何为python/numpy设置舍入模式。但是,这似乎不起作用,因为下面的代码仍在打印 南安 :

    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 回复  |  直到 6 年前
        1
  •  0
  •   Sreeragh A R    7 年前

    代替

    ret=session.run(root)
    

    具有

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

    参考 tf.where