我正在寻找在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在第一个纪元后保存其处理过的图像?
谢谢!
答案 0 :(得分:2)
我假设你已经解决了这个问题,但不过......
Keras图像预处理可以通过在save_to_dir
或flow()
函数中设置flow_from_directory()
参数来保存结果:
答案 1 :(得分:0)
据我了解,问题在于增强图像在模型的训练周期中仅使用了一次,甚至没有跨几个时期使用。因此,在CPU苦苦挣扎的同时,这是GPU周期的巨大浪费。 我找到了以下解决方案:
大多数情况下,这种方法使GPU处于繁忙状态,同时能够受益于数据增强。我使用自定义Sequence子类来生成扩充并同时修复类的不平衡。