10

我已经在CNN上工作了数百GB的图像。我已经创建了一个训练函数来咬合这些图像的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

创建自定义生成器类并将其与fit_generator结合使用可避免多次调用拟合的整个问题。 –

回答

13

对于不适合到内存中的数据集,也就是在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并且自己照顾批量大小和迭代。

还有一点需要注意的是,您应该确保您在每个时期后对您的模型进行训练的样本的排序顺序。您编写示例代码的方式似乎不会混洗数据集。你可以阅读一些有关洗牌herehere

+1

我明白我们可以使用train_on_batch,但我仍然不明白为什么OP的原始代码不起作用。 fit()是否会在每次数据馈送迭代中更新模型? – ymeng

2

这个问题是在Keras github repositoryIssue #4446: Quick Question: can a model be fit for multiple times?提出它是由François Chollet关闭与以下statement

是的,fit连续通话将逐步训练模型。

所以,是的,你可以称呼多次。

+0

尽管此链接可能会回答问题,但最好在此处包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/18515017) – EJoshuaS