在Keras多次呼叫"适合"

jon*_*ith 29 machine-learning neural-network theano conv-neural-network keras

我在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)
Run Code Online (Sandbox Code Playgroud)

我知道API和Keras论坛说这将训练整个数据集,但我不能直观地理解为什么网络不会重新学习最后一个训练块.

一些帮助理解这将非常感激.

最好,乔

Mak*_*dis 24

对于不适合内存的数据集,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并处理批量大小和迭代.

还有一点需要注意的是,您应该确保在每个时代之后对您训练模型的样本的顺序进行洗牌.您编写示例代码的方式似乎不会改变数据集.你可以在这里这里阅读更多关于改组的内容

  • 我知道我们可以使用 train_on_batch,但我仍然不明白为什么 OP 的原始代码不起作用。fit() 是否也在每次数据馈送迭代中更新模型? (3认同)
  • `model.fit` 在内部管理您提供的数据集的输入和输出,将它们分成批次并逐步训练每个批次,同时还报告进度并支持在训练期间执行的自定义回调。另一方面,`model.train_on_batch` 只需要一批输入和输出,并在一个步骤中训练模型。 (3认同)
  • 鉴于下面@curlyhairedgenius 的回答,目前还不清楚多次调用`model.fit` 或`model.train_on_batch` 之间的区别是什么。有吗? (2认同)

cur*_*ius 14

问题是在问题#4446Keras github存储库中提出的:快速问题:模型可以多次适合吗? 它由FrançoisChollet关闭,声明如下:

是的,连续调用fit将逐步训练模型.

所以,是的,你可以多次调用fit.

  • 语句“是的,连续调用`fit`将逐步训练模型” *似乎是正确的,但是当我训练模型并连续调用`fit`时,我看到的是绝对的第一次调用,需要一段时间才能完成对于我的数据集,达到我通常的`val_acc:0.9x`,每次后续调用都比此初始调用快,但是每次调用`fit`时,我都会看到`val_acc`每次都下降到`0.05`左右,然后再返回到90%。如果正在逐步训练模型,为什么会这样? (3认同)
  • 我也想听听这个问题的答案。 (2认同)