我正在使用数百GB的图像处理CNN。我已经创建了一个训练函数,可以剔除这些图像的4Gb块,并在每个部分上调用fit
。我担心我只会训练最后一块而不是整个数据集。
实际上,我的伪代码看起来像这样:
DS = lazy_load_400GB_Dataset()
for section in DS:
X_train = section.images
Y_train = section.classes
model.fit(X_train, Y_train, batch_size=16, nb_epoch=30)
我知道API和Keras论坛说这将训练整个数据集,但我不能直观地理解为什么网络不会重新学习最后一个训练块。
非常感谢一些帮助理解这一点。
最佳, 乔
答案 0 :(得分:23)
对于不适合内存的数据集,Keras Documentation FAQ section
中有一个答案您可以使用
model.train_on_batch(X, y)
和。进行批量培训model.test_on_batch(X, y)
。请参阅models documentation。或者,您可以编写一个生成批次的生成器 训练数据并使用方法
model.fit_generator(data_generator, samples_per_epoch, nb_epoch)
。您可以在我们的CIFAR10 example中看到批处理培训。
因此,如果您想按照自己的方式迭代数据集,则应该使用model.train_on_batch
并自己处理批量大小和迭代。
还有一点需要注意的是,您应该确保在每个纪元之后对您训练模型的样本的顺序进行调整。您编写示例代码的方式似乎不会改变数据集。您可以阅读有关改组here和here
的更多信息答案 1 :(得分:10)
Keras github repository中的Issue #4446: Quick Question: can a model be fit for multiple times?提出了这个问题。François Chollet以statement结束了该问题:
是的,对
fit
的连续调用将逐步训练模型。
所以,是的,你可以多次调用fit。