我正在使用tensorflow中的卷积神经网络,我遇到了问题。问题是我通过tfrecords读取的输入图像包含一定数量的nan值。造成这种情况的原因是图像表示深度图,其中包含一些无限值,并且在tfrecord中对其进行编码然后解码以将其提供给网络时,这些无限值变为纳米值。
现在,因为在我的情况下替换原始图像中的无限值然后在tfrecors中编码它不是一个选项,有任何方法我可以替换我的图像张量中的nan值作为我进行之前的操作它到网上?
答案 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)