我在使用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
类)优于上述方法(当然,如果你忽略了可能需要编写更多代码的事实),并且副作用较少(因为你可以丢弃单个图像而不是整个批次)。