我在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论坛说这将在整个数据集上进行训练,但我无法直观地理解为什么网络不会在最后一个训练块上重新学习。
请帮助我理解这一点,我将不胜感激。
最好的,乔
这个问题是在Keras github储存库问题#4446中提出的:快速问题:一个模型可以适合多次吗?francois Chollet以以下声明结束了会议:
是的,连续调用
fit
将增量地训练模型。
所以,是的,你可以多次调用fit
对于内存无法容纳的数据集,可以在Keras文档常见问题解答部分
中找到答案。您可以使用
model.train_on_batch(X, y)
和进行批量训练model.test_on_batch(X, y)
。参见模型文档。或者,您可以编写一个生成器来生成批量的并使用
model.fit_generator(data_generator, samples_per_epoch, nb_epoch)
.您可以在我们的CIFAR10示例中看到批处理训练。
所以如果你想迭代你的数据集的方式,你应该使用model.train_on_batch
和照顾批大小和迭代自己。
还有一件事要注意,你应该确保你训练模型的样本的顺序在每个epoch之后被打乱。您编写示例代码的方式似乎没有打乱数据集。你可以在这里和这里阅读更多关于洗牌的内容