【问题标题】:Check if NaN in Tensorflow检查 Tensorflow 中是否为 NaN
【发布时间】:2018-02-03 00:51:09
【问题描述】:

我想检查一个 tensorflow 变量,如果它是 NaN,则将其设置为零。

我该怎么做?以下技巧似乎不起作用:

if tf.is_nan(v) is True:
    v = 0.0

【问题讨论】:

  • 你确定 is_nan() 返回一个布尔值吗?
  • 它返回一个布尔类型的张量
  • v的形状是什么? v 是标量吗?
  • 是优化的代价。所以,是的,它是一个包含标量数的张量。

标签: python if-statement tensorflow nan


【解决方案1】:

为了使所有内容都成为 tf 操作,如果它是 NaN,我使用它来将单个值转换为 0:

value_not_nan = tf.dtypes.cast(tf.math.logical_not(tf.math.is_nan(value)), dtype=tf.float32)
tf.math.multiply_no_nan(value, value_not_nan)

【讨论】:

    【解决方案2】:

    对于 TensorFlow 2.0

    你可以吗:

    import tensorflow as tf
    
    if tf.math.is_nan(v):
        print("v is NaN")
    

    或使用 numpy

    import numpy as np
    
    if np.is_nan(v):
        print("v is NaN")
    

    【讨论】:

    • 很高兴他们添加了这个。这比原来的要干净得多,但我想知道如何使用tf.wheretf.is_nan 如果您需要对向量(或批处理)而不是仅对标量进行这种检查,仍然很好.
    【解决方案3】:

    如果 v 是 0d 张量,您可以使用 tf.where 来测试和更新值:

    import numpy as np
    
    v = tf.constant(np.nan)                  # initialize a variable as nan  ​
    v = tf.where(tf.is_nan(v), 0., v)
    ​
    with tf.Session() as sess:    
        print(sess.run(v))
    
    # 0.0
    

    【讨论】:

      【解决方案4】:

      我希望这可以帮助你。 math.is_nan

      import math
      if math.isnan(float(v)):
          v = 0.0
      

      【讨论】:

      • 不是张量流操作,可惜没用的答案
      【解决方案5】:

      像 numpy(在本例中为 tensorflow)之类的库通常有自己的布尔实现,比较自定义布尔类型的内存地址,而 CPython 内置使用 is 将导致不稳定的行为。

      要么检查隐式布尔值 -> if tf.is_nan(v),要么进行相等比较 if tf.is_nan(v) == True

      【讨论】:

        【解决方案6】:

        如果 tensorflow 值为 NAN,您可以将 tf.is_nan 与 tf.cond 结合使用来更改值。

        【讨论】:

          猜你喜欢
          • 2016-11-14
          • 2012-07-11
          • 2014-11-09
          • 1970-01-01
          • 2012-04-11
          • 2021-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多