如何使用tf.data.Dataset.ignore_errors忽略Tensorflow数据集中的错误?

lztngnrs  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(154)

从Tensorflow中的目录加载图像时,您可以使用类似于以下内容的命令:

dataset = tf.keras.utils.image_dataset_from_directory(
    "S:\\Images",
    batch_size=32,
    image_size=(128,128),
    label_mode=None,
    validation_split=0.20, #Reserve 20% of images for validation
    subset='training',     #If we specify a validation_split, we *must* specify subset
    seed=619               #If using validation_split we *must* specify a seed to ensure there is no overlap between training and validation data
)

当然,有些图像(.jpg.png.gif.bmp)是无效的,所以我们希望忽略这些错误;只要跳过它们(并且理想地记录文件名,以便它们可以被修复、移除或删除)。
在如何忽略无效图像的过程中,出现了一些想法:

方法1:tf.contrib.data.ignore_errors(仅限tensorflow 1.x)

    • 警告:**tf. contrib模块不会包含在TensorFlow 2.0中。

样品使用:

dataset = dataset.apply(tf.contrib.data.ignore_errors())

这个方法唯一的缺点是it was only available in Tensorflow 1,现在尝试使用它是行不通的,因为tf.contib名称空间已经不存在了,这导致了一个内置的方法:

方法二:tf.data.experimental.ignore_errors(log_warning=False)(不建议使用)

来自文档:
从另一个数据集创建数据集并自动忽略任何错误。(不推荐使用)

    • 已弃用:**此函数已弃用。它将在将来的版本中删除。更新说明:请改用tf.data.Dataset.ignore_errors

样品使用:

dataset = dataset.apply(tf.data.experimental.ignore_errors(log_warning=True))

这个方法很有效,效果很好,而且它的优点是有效。
但它显然已被弃用,而且他们的文档说我们应该使用方法3:

方法3-tf.data.Dataset.ignore_errors(log_warning=False, name=None)

删除导致错误的元素。
样品使用:

dataset = dataset.ignore_errors(log_warning=True, name="Loading images from directory")

除了它不工作

dataset.ignore_errors属性不起作用,并给出错误:
属性错误:"BatchDataset"对象没有属性"ignore_errors"
这意味着:

  • 有效的东西被废弃了
  • 他们告诉我们用另一个东西代替
  • "提供更新说明"
  • 但另一件事不起作用

所以我们问斯塔克溢出:
如何使用tf.data.Dataset.ignore_errors忽略错误?

额外阅读

未经测试的变通方案

这不仅不是我想问的,而且人们不允许读到这篇文章:
看起来tf.data.Dataset.ignore_errors()方法在BatchDataset对象中不可用,而BatchDataset对象是您在代码中使用的对象。您可以尝试使用tf.data.Dataset.filter()来过滤掉在加载图像时导致错误的元素。您可以在传递给filter()的lambda函数中使用try-except块来捕获错误,并为导致错误的元素返回False。这将过滤掉它们。下面是一个如何使用filter()来实现这一点的示例:

def filter_fn(x):   
  try:
    # Load the image and do some processing
    # Return True if the image is valid, False otherwise
    return True   
  except:
    return False

dataset = dataset.filter(filter_fn)

此外,您还可以使用tf.data.experimental.ignore_errors()方法,该方法目前在TensorFlow 2.x中可用。此方法将静默忽略处理数据集元素时发生的任何错误。但请记住,此方法是实验性的,在未来版本中可能会删除或更改。

hc8w905p

hc8w905p1#

tf.data.Dataset.ignore_errors是在TensorFlow 2.11中引入的。您可以将tf.data.experimental.ignore_errors用于旧版本,如下所示:

dataset.apply(tf.data.experimental.ignore_errors())

相关问题