在Keras中使用ImageDataGenerator.flow_from_directory处理无效/损坏的图像文件

我在使用Python和Keras,运行ImageDataGenerator并使用flow_from_directory。我有一些问题图像文件,所以我想知道是否可以使用数据生成器来处理读取错误?

我在少部分图像上遇到了“无效的jpg文件”错误,希望能处理这些错误而不让我的代码崩溃。


回答:

一种解决方案是修改ImageDataGenerator代码,并在其中加入错误处理机制(即try/except)。

然而,另一种方法是将你的生成器包装在另一个生成器中,并在那里使用try/except。这种解决方案的缺点是,即使批次中只有一个图像损坏,也会丢弃整个生成的批次(这可能意味着某些样本可能完全不会用于训练):

data_gen = ImageDataGenerator(...)train_gen = data_gen.flow_from_directory(...)def my_gen(gen):    while True:        try:            data, labels = next(gen)            yield data, labels        except:            pass# ... 定义你的模型并编译它# 拟合模型model.fit_generator(my_gen(train_gen), ...)

这种解决方案的另一个缺点是,由于你需要指定生成器的步数(即steps_per_epoch),考虑到在某一步中可能会丢弃一个批次并在同一步骤中获取一个新的批次,你可能会在一个epoch中对某些样本进行多次训练。这可能会或不会有显著影响,这取决于包含损坏图像的批次数量(即如果数量很少,则不必过于担心)。

最后,请注意,你可能想使用更新的Keras数据生成器,即Sequence类,在每个批次的__getitem__方法中逐个读取图像,并丢弃损坏的图像。然而,前一种方法的问题,即对某些图像进行多次训练,仍然存在于这种方法中,因为你也需要实现__len__方法,它本质上等同于steps_per_epoch参数。尽管如此,在我看来,这种方法(即子类化Sequence类)优于上述方法(当然,如果你忽略了可能需要编写更多代码的事实),并且副作用较少(因为你可以丢弃单个图像而不是整个批次)。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注