我正在处理数百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论坛都表示这样会对整个数据集进行训练,但我无法直观地理解为什么网络不会仅仅重新学习最后一个训练数据块。
对此的帮助将不胜感激。
最好的祝愿,Joe
回答:
对于无法一次性加载到内存中的数据集,Keras文档FAQ部分有解答,点击此处查看
你可以使用
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
,并自己处理批量大小和迭代问题。
另外要注意的是,你应该确保每次训练周期后,用于训练模型的样本顺序是打乱的。从你提供的示例代码来看,似乎没有对数据集进行打乱。你可以在这里了解更多关于打乱数据的信息:链接1和链接2