替换张量流张量中的nan值

Dra*_*kem 13 python tensorflow

我正在研究张量流中的卷积神经网络,我遇到了问题.问题是我通过tfrecords读取的输入图像包含一定数量的nan值.造成这种情况的原因是图像表示深度图,其中包含一些无限值,并且在tfrecord中对其进行编码然后解码以将其馈送到网络中这些无限值变为nan值.

现在,因为在我的情况下替换原始图像中的无限值然后在tfrecors中编码它不是一个选项,有任何方法我可以替换我的图像张量中的nan值作为一个操作,然后我将它提供给净?

All*_*oie 25

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())
Run Code Online (Sandbox Code Playgroud)

打印(使用TensorFlow 0.12.1):

[ 0.  1.]
Run Code Online (Sandbox Code Playgroud)


Joh*_*yen 8

按值剪辑使 NaN 无穷大,对于一个变量来说是过度杀伤力。我用它来将单个值转换为 0(如果它是 NaN):

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)
Run Code Online (Sandbox Code Playgroud)


Val*_*nal 7

如果有人在 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())
Run Code Online (Sandbox Code Playgroud)


Dan*_*Dan 5

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

no_nans = tf.clip_by_value(has_nans, -1e12, 1e12)
Run Code Online (Sandbox Code Playgroud)

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

  • 这在张量流 2.8 中不起作用。 (2认同)