【问题标题】:Filter NaN values in Tensorflow dataset过滤 Tensorflow 数据集中的 NaN 值
【发布时间】:2020-10-01 14:23:33
【问题描述】:

是否有一种简单的方法可以从 tensorflow.data.Dataset 实例中过滤所有包含 nan 值的条目?喜欢 Pandas 中的dropna 方法?


简短示例:

import numpy as np
import tensorflow as tf

X = tf.data.Dataset.from_tensor_slices([[1,2,3], [0,0,0], [np.nan,np.nan,np.nan], [3,4,5], [np.nan,3,4]])
y = tf.data.Dataset.from_tensor_slices([np.nan, 0, 1, 2, 3])
ds = tf.data.Dataset.zip((X,y))
ds = foo(ds)  # foo(x) = ?
for x in iter(ds): print(str(x))

foo(x) 可以使用什么来获得以下输出:

(<tf.Tensor: shape=(3,), dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>, <tf.Tensor: shape=(), dtype=float32, numpy=0.0>)
(<tf.Tensor: shape=(3,), dtype=float32, numpy=array([3., 4., 5.], dtype=float32)>, <tf.Tensor: shape=(), dtype=float32, numpy=2.0>)

如果你想亲自尝试,here is Google Colab notebook

【问题讨论】:

    标签: python tensorflow tensorflow2.0 tensorflow-datasets


    【解决方案1】:

    我的方法与现有答案略有不同。我没有使用 sum,而是使用 tf.reduce_any:

    filter_nan = lambda x, y: not tf.reduce_any(tf.math.is_nan(x)) and not tf.math.is_nan(y)
    
    ds = tf.data.Dataset.zip((X,y)).filter(filter_nan)
    
    list(ds.as_numpy_iterator())
    
    [(array([0., 0., 0.], dtype=float32), 0.0),
     (array([3., 4., 5.], dtype=float32), 2.0)]
    

    【讨论】:

      【解决方案2】:

      怎么样:

      def any_nan(t):
          return tf.reduce_sum(
              tf.cast(
                  tf.math.is_nan(t),
                  tf.int32,
              )
          ) > tf.constant(0)
      
      
      >>> ds_filtered = ds.filter(lambda x, y: not any_nan(x) and not any_nan(y))
      >>> for x in iter(ds_filtered): print(str(x))
      (<tf.Tensor: shape=(3,), dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>, <tf.Tensor: shape=(), dtype=float32, numpy=0.0>)
      (<tf.Tensor: shape=(3,), dtype=float32, numpy=array([3., 4., 5.], dtype=float32)>, <tf.Tensor: shape=(), dtype=float32, numpy=2.0>)
      

      【讨论】:

        猜你喜欢
        • 2018-02-19
        • 1970-01-01
        • 1970-01-01
        • 2020-05-22
        • 2018-07-29
        • 2014-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多