Keras ImageDataGenerator很慢

时间:2016-12-10 03:24:15

标签: neural-network generator keras training-data

我正在寻找在Keras上训练大于内存数据的最佳方法,并且目前注意到vanilla ImageDataGenerator往往比我希望的要慢。

我在Kaggle cat's vs dogs数据集上有两个网络培训(25000张图片):

1)这种方法恰好来自:http://www.pyimagesearch.com/2016/09/26/a-simple-neural-network-with-python-and-keras/

2)与(1)相同,但使用ImageDataGenerator而不是将数据加载到内存中

注意:对于下面的内容,“预处理”意味着调整大小,缩放,展平

我在gtx970上找到以下内容:

对于网络1,每个时期需要约0秒。

对于网络2,如果在数据生成器中完成预处理,则每个时期需要大约36秒。

对于网络2,如果在数据生成器外部的第一遍中完成预处理,则每个时期需要大约13秒。

这可能是ImageDataGenerator的速度限制(13s似乎是磁盘和RAM之间通常的10-100x差异......)?在使用Keras时,是否有更适合培训大于内存数据的方法/机制? 例如也许有办法让Keras中的ImageDataGenerator在第一个纪元后保存其处理过的图像?

谢谢!

2 个答案:

答案 0 :(得分:2)

我假设你已经解决了这个问题,但不过......

Keras图像预处理可以通过在save_to_dirflow()函数中设置flow_from_directory()参数来保存结果:

https://keras.io/preprocessing/image/

答案 1 :(得分:0)

据我了解,问题在于增强图像在模型的训练周期中仅使用了一次,甚至没有跨几个时期使用。因此,在CPU苦苦挣扎的同时,这是GPU周期的巨大浪费。 我找到了以下解决方案:

  1. 我会在RAM中生成尽可能多的增强
  2. 我用它们在整个10到30个纪元的时间范围内进行训练,无论需要什么时间才能获得明显的收敛
  3. 之后,我通过实施on_epoch_end生成了一批新的增强图像,然后继续进行处理。

大多数情况下,这种方法使GPU处于繁忙状态,同时能够受益于数据增强。我使用自定义Sequence子类来生成扩充并同时修复类的不平衡。