使用Keras模型进行大数据集的超参数优化

3
我希望对我的Keras模型进行超参数优化。问题在于数据集很大,通常在训练中我使用fit_generator从磁盘批量加载数据,但是像SKlearn Gridsearch、Talos等常见的包只支持fit方法。
我尝试通过以下方式将所有数据加载到内存中:
train_generator = train_datagen.flow_from_directory(
    original_dir,
    target_size=(img_height, img_width),
    batch_size=train_nb,
    class_mode='categorical')
X_train,y_train = train_generator.next()

但是,在执行网格搜索时,由于内存使用过大,操作系统会杀死它。我也尝试将数据集降采样到只有25%,但仍然太大。 有没有人在和我一样的情况下有经验? 请分享您执行大型数据集的超参数优化的策略。 从@dennis-ec的回答中,我尝试遵循这里SkOpt的教程:http://slashtutorial.com/ai/tensorflow/19_hyper-parameters/,这是一个非常全面的教程。

你可以在Talos中使用fit_generator()。请参见此处的信息:https://dev59.com/2rDla4cB1Zd3GeqP4Cxg - mikkokotila
2个回答

2
在我看来,GridSearch并不是一种好的超参数优化方法,尤其是在深度学习中存在许多超参数的情况下。我建议使用贝叶斯超参数优化。这里是一个使用skopt实现贝叶斯超参数优化的教程链接:https://scikit-optimize.github.io/stable/auto_examples/hyperparameter-optimization.html。你需要编写一个函数来进行训练并返回你的验证分数以进行优化,因此API不关心你是否使用keras中的fit或fit_generator函数。

1

是的,我也看了那个答案,我试图修改它以与flow_from_directory一起使用,但对我来说相当复杂。 - Thanh Nguyen
哦,是的,现在我看到你的评论了。我的错。老实说,我不确定你如何使用flow_from_directory来实现它,因为我没有太多经验,但我可以提供一个替代方案:进行更激进的欠采样,直到你能够让它运行,然后使用其进行网格搜索,接着在生成器上验证这些参数。至少这是一个B计划,如果你不能否则使它正常工作。 - VegardKT
是的,我尝试了甚至10%的采样,但对于内存来说仍然太大了。我的数据集有9个类别,所以10%已经达到了限制。 - Thanh Nguyen
你的数据集有多大?(文件大小和样本数量) - VegardKT
我总共有9000张图片,每张图片大约10-20 KB。 - Thanh Nguyen
真的吗?我觉得你的内存不足很奇怪。 - VegardKT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接