替换张量流张量中的nan值

时间:2017-02-04 17:45:13

标签: python tensorflow

我正在使用tensorflow中的卷积神经网络,我遇到了问题。问题是我通过tfrecords读取的输入图像包含一定数量的nan值。造成这种情况的原因是图像表示深度图,其中包含一些无限值,并且在tfrecord中对其进行编码然后解码以将其提供给网络时,这些无限值变为纳米值。

现在,因为在我的情况下替换原始图像中的无限值然后在tfrecors中编码它不是一个选项,有任何方法我可以替换我的图像张量中的nan值作为我进行之前的操作它到网上?

4 个答案:

答案 0 :(得分:22)

tf.where和tf.is_nan的组合应该有效:

import tensorflow as tf
with tf.Session():
    has_nans = tf.constant([float('NaN'), 1.])
    print(tf.where(tf.is_nan(has_nans), tf.zeros_like(has_nans), has_nans).eval())

打印(使用TensorFlow 0.12.1):

[ 0.  1.]

答案 1 :(得分:3)

与TF2.0兼容的一种更简单的方法是只使用tf.clip_by_value,它镜像np.clip并删除NaN(请参阅here):

no_nans = tf.clip_by_value(has_nans, -1e12, 1e12)

一些警告: 1)这也会删除infs 2)根据您的应用程序,可能需要将裁剪值设置为较高的值,以免丢失信息。

答案 2 :(得分:1)

如果有人在Tensorflow 2.0中寻找解决方案,则Allen Lavoie的改编代码为:

import tensorflow as tf
with tf.compat.v1.Session():
    has_nans = tf.constant([float('NaN'), 1.])
    print(tf.where(tf.math.is_nan(has_nans), tf.zeros_like(has_nans), has_nans).eval())

答案 3 :(得分:0)

按值截取会使NaN变为无穷大,而对于一个变量而言,该值就显得过大了。如果是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)