【问题标题】:Calling "fit" multiple times in Keras在 Keras 中多次调用“fit”
【发布时间】:2017-01-08 20:01:58
【问题描述】:

我正在处理一个包含数百 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 论坛说这将在整个数据集上进行训练,但我无法直观地理解为什么网络不会仅在最后一个训练块上重新学习。

非常感谢您对理解这一点的帮助。

最好, 乔

【问题讨论】:

  • 创建一个自定义生成器类并将其与 fit_generator 一起使用将避免多次调用 fit 的整个问题。

标签: machine-learning neural-network theano conv-neural-network keras


【解决方案1】:

这个问题是在Issue #4446: Quick Question: can a model be fit for multiple times? 中的Keras github repository 提出的,它由François Chollet 关闭,并带有以下statement

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

所以,是的,您可以多次调用 fit。

【讨论】:

  • 声明“是的,对fit 的连续调用将逐步训练模型” 似乎是正确的,但是当我训练我的模型时,连续调用fit,我看到的是绝对的第一次调用,需要一段时间才能达到我的数据集通常的val_acc: 0.9x,每个后续都比这个初始调用更快,但是每次调用fit,我看到val_acc 下降到大约0.05 每次,然后回到 90%。如果是增量训练模型,为什么会这样?
  • 我也想听听这个问题的答案。
【解决方案2】:

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

还有一点需要注意的是,您应该确保在每个 epoch 之后,您训练模型的样本的顺序是随机的。您编写示例代码的方式似乎没有打乱数据集。你可以阅读更多关于洗牌 herehere

【讨论】:

  • 我知道我们可以使用 train_on_batch,但我仍然不明白为什么 OP 的原始代码不起作用。 fit() 是否也在数据馈送的每次迭代中更新模型?
  • 鉴于下面@curlyhairedgenius 的回答,目前还不清楚多次调用model.fitmodel.train_on_batch 之间的区别是什么。有吗?
  • model.fit 在内部管理您提供的数据集的输入和输出,将它们分成批次并逐步训练每个批次,同时还报告进度并支持在训练期间执行自定义回调.另一方面,model.train_on_batch 只需获取一批输入和输出,然后对模型进行单步训练。
猜你喜欢
  • 2021-09-20
  • 2019-10-27
  • 2021-08-20
  • 2019-04-21
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
相关资源
最近更新 更多