从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中可用。此方法将静默忽略处理数据集元素时发生的任何错误。但请记住,此方法是实验性的,在未来版本中可能会删除或更改。
1条答案
按热度按时间hc8w905p1#
tf.data.Dataset.ignore_errors
是在TensorFlow 2.11中引入的。您可以将tf.data.experimental.ignore_errors
用于旧版本,如下所示: