![](/img/trans.png)
[英]Use keras ImageDataGenerator.flow_from_directory() with Talos Scan()
[英]Handle invalid/corrupted image files in ImageDataGenerator.flow_from_directory in Keras
我将Python与flow_from_directory
一起使用并运行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
# ... define your model and compile it
# fit the model
model.fit_generator(my_gen(train_gen), ...)
该解决方案的另一个缺点是,由于您需要指定生成器的步数(即steps_per_epoch
),并考虑到可能在一个步骤中丢弃一个批处理,而在同一步骤中steps_per_epoch
一个新的批处理,因此您可能最终在某个时期不只一次对某些样本进行训练。 这可能会或可能不会产生重大影响,具体取决于有多少批次包含损坏的图像(即,如果有少量,则不必担心那么多)。
最后,请注意,您可能希望使用更新的Keras数据生成器(即Sequence
类)来在__getitem__
方法中逐批读取图像并丢弃损坏的图像。 但是,由于您还需要实现__len__
方法,因此前一种方法的问题(即多次训练某些图像)仍然存在,因为它实际上等效于steps_per_epoch
参数。 尽管在我看来,这种方法(即对Sequence
类进行子类化)优于上述方法(当然,如果您撇开了可能需要编写更多代码的事实)并且副作用较少(因为您可以丢弃单张图片,而不是整个批次)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.