我正在使用Keras和Theano来训练一个基本的逻辑回归模型。
假设我有一个100万个条目的训练集,对于我的系统来说,使用标准的model.fit()
而不消耗内存太大了。
- 我决定使用python生成器函数并使用
model.fit_generator()
拟合我的模型。 - 我的生成器函数返回1M训练示例的批处理大小的块(它们来自一个DB表,所以我一次只提取足够的记录来满足每个批处理请求,保持内存使用检查)。
- 它是一个无限循环的生成器,一旦它达到100万的末尾,它就循环并继续在set 上运行
fit_generator()
中有一个强制参数指定samples_per_epoch
。文档显示
samples_per_epoch: integer,在进入下一个epoch之前要处理的采样数。
我假设fit_generator()
不会在每次epoch运行时重置生成器,因此需要无限运行的生成器。
我通常将samples_per_epoch
设置为生成器正在循环的训练集的大小。
但是,如果samples_per_epoch
小于生成器正在使用的训练集的大小,并且nb_epoch
> 1:
- 你会得到奇怪的/不利的/意想不到的训练结果,因为似乎时代将有不同的训练样本集来适应?
- 如果是这样,您是否以某种方式"快进"您的生成器?
我现在正在处理一些类似的事情。我想让我的周期更短,这样我就可以记录更多关于损失的信息,或者更频繁地调整我的学习率。
不深入代码,我认为.fit_generator
与ImageDataGenerator
内置的keras生成的随机增强/洗牌数据一起工作的事实支持了您的怀疑,即它不会在每个epoch重置生成器。所以我相信你应该没问题,只要模型暴露在你的整个训练集上,如果其中一些是在一个单独的时代训练的,那就没关系了。
如果你仍然担心,你可以尝试编写一个生成器来随机采样你的训练集。