【问题标题】:Optimal batch size and epochs for large models大型模型的最佳批量大小和时期
【发布时间】:2020-04-19 13:08:42
【问题描述】:

我知道有很多相关的问题,但我希望有人可以针对我正在尝试构建的模型提供一些建议。

这是一个图像分类模型。目前我正在尝试对 40 个不同的类别(40 种不同类型的动物)进行分类。每个类中有 120 到 220 张图像。我的训练集是 4708 张图像,我的验证集是 2512 张图像。

我运行了一个顺序模型(代码如下),其中我使用了 64 和 30 个 epoch 的批量大小。该代码需要很长时间才能运行。 30 个 epoch 后的准确度在验证集上约为 67,在训练集上约为 70。验证集的损失约为 1.2,训练集的损失约为 1(我在下面包含了最后 12 个 epoch 的结果)。它似乎在大约 25 个 epoch 后逐渐减少。

我的问题是关于批量大小和时期的。使用更大或更小的批量大小(超过 64 个)是否有价值,我应该使用更多的 epoch。我读到通常在 50 到 100 个 epoch 之间是常见的做法,但是如果我的结果在 25 之后逐渐减少,那么增加更多是有价值的。

型号

history = model.fit_generator(
    train_data_gen,
    steps_per_epoch= 4708 // batch_size,
    epochs=30,
    validation_data=val_data_gen,
    validation_steps= 2512 // batch_size
)

结果

Epoch 18/30
73/73 [==============================] - 416s 6s/step - loss: 1.0982 - accuracy: 0.6843 - val_loss: 1.3010 - val_accuracy: 0.6418
Epoch 19/30
73/73 [==============================] - 414s 6s/step - loss: 1.1215 - accuracy: 0.6712 - val_loss: 1.2761 - val_accuracy: 0.6454
Epoch 20/30
73/73 [==============================] - 414s 6s/step - loss: 1.0848 - accuracy: 0.6809 - val_loss: 1.2918 - val_accuracy: 0.6442
Epoch 21/30
73/73 [==============================] - 413s 6s/step - loss: 1.0276 - accuracy: 0.7013 - val_loss: 1.2581 - val_accuracy: 0.6430
Epoch 22/30
73/73 [==============================] - 415s 6s/step - loss: 1.0985 - accuracy: 0.6854 - val_loss: 1.2626 - val_accuracy: 0.6575
Epoch 23/30
73/73 [==============================] - 413s 6s/step - loss: 1.0621 - accuracy: 0.6949 - val_loss: 1.3168 - val_accuracy: 0.6346
Epoch 24/30
73/73 [==============================] - 415s 6s/step - loss: 1.0718 - accuracy: 0.6869 - val_loss: 1.1658 - val_accuracy: 0.6755
Epoch 25/30
73/73 [==============================] - 419s 6s/step - loss: 1.0368 - accuracy: 0.6957 - val_loss: 1.1962 - val_accuracy: 0.6739
Epoch 26/30
73/73 [==============================] - 419s 6s/step - loss: 1.0231 - accuracy: 0.7067 - val_loss: 1.3491 - val_accuracy: 0.6426
Epoch 27/30
73/73 [==============================] - 434s 6s/step - loss: 1.0520 - accuracy: 0.6919 - val_loss: 1.2039 - val_accuracy: 0.6683
Epoch 28/30
73/73 [==============================] - 417s 6s/step - loss: 0.9810 - accuracy: 0.7151 - val_loss: 1.2047 - val_accuracy: 0.6711
Epoch 29/30
73/73 [==============================] - 436s 6s/step - loss: 0.9915 - accuracy: 0.7140 - val_loss: 1.1737 - val_accuracy: 0.6711
Epoch 30/30
73/73 [==============================] - 424s 6s/step - loss: 1.0006 - accuracy: 0.7087 - val_loss: 1.2213 - val_accuracy: 0.6619

【问题讨论】:

  • 关于您的模型(或您的数据,我们没有)没有什么特别要说的;关于批量大小,适用 SO 线程 How to calculate optimal batch size 中提到的一般注意事项。

标签: python tensorflow machine-learning keras neural-network


【解决方案1】:

您应该只在模型不再“学习”时才中断训练过程,这意味着验证数据的损失和准确性不会提高。为此,您可以放置​​任意数量的 epoch,并使用 tf.keras.callbacks.EarlyStopping (documentation)。这将在满足特定条件时中断训练过程,例如当 val_loss 在 10 个 epoch 内没有减少时。

es = EarlyStopping(monitor='val_loss', patience=10)
fit_generator(... callbacks=[es])

这将确保模型仍在学习时不会中断学习过程,并且模型不会过拟合。

32 的批量大小是标准的,但这是一个与另一个网站更相关的问题,因为它是关于统计数据的(并且争论非常激烈)。

【讨论】:

  • 谢谢 Nicolas,这非常有用
【解决方案2】:

是的,如果您可以尽可能大批量处理。

大批量几乎总是会导致更快的收敛和更短的训练时间。如果您的 GPU 具有良好的内存,那就尽可能地提高。

至于 epochs,很难决定,因为我可以你的模型在 28-29 epochs 中仍在改进,所以你可能需要训练更多的 epochs 以获得更好的模型,但似乎也要寻找 val_accuracy你的 val_acc 也在提高,这表明模型需要更多的训练。

您可以使用 ModelCheckpoint 在每个 epoch 之后存储模型,以获得模型的最佳版本。 https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/ModelCheckpoint

你可以使用 keras

【讨论】:

  • 谢谢Zabir,非常有用的东西
【解决方案3】:

选择批量大小的三个原因。

  1. 速度。如果您使用的是 GPU,那么大批量的处理速度通常几乎与小批量的处理速度一样快。这意味着个别情况要快得多,这意味着每个时期也更快。
  2. 正则化。较小的批次会增加正则化,类似于增加 dropout、增加学习率或增加权重衰减。较大的批次会减少正则化。
  3. 内存限制。这是一个硬限制。在某个时刻,您的 GPU 将无法将所有数据放入内存中,并且您无法再增加批量大小。

这表明在内存不足之前,更大的批处理大小会更好。除非您遇到过拟合问题,否则较​​大且仍在工作的批大小将 (1) 加速训练和 (2) 允许更大的学习率,这也加快了训练过程。

第二点是由于正则化。如果你增加批量大小,减少的正则化会返回一些“正则化预算”来增加学习率,这将增加正则化。


顺便说一下,正则化只是一种考虑训练过程噪音或平滑程度的方法。

低正则化意味着训练非常平滑,这意味着训练容易收敛但也容易训练过拟合。

高正则化意味着训练更嘈杂或更困难,但验证结果更好,因为嘈杂的训练过程减少了过度拟合和由此产生的泛化错误。

如果您熟悉Bias-Variance Tradeoff,添加正则化是一种添加一点偏差以减少方差的方法。以下是关于该主题的众多优秀文章之一:Regularization: the path to bias-variance trade-off


关于正则化、训练计划和超参数调整等更广泛的主题,我强烈推荐 Leslie N. Smith 的两篇关于该主题的论文。

关于 Super-Convergence 的第一篇论文还将解决您关于使用多少个 epoch 的一些问题。


之后,对于使用多少个 epoch 没有正确答案,只有指导。我要做的是:
  • 在处理模型时,尽可能快地保持训练计划。更快的训练意味着可以尝试更多的想法并更精细地调整您的超参数。
  • 当您出于某种原因(提交给 Kaggle,将模型部署到生产环境)准备好微调结果时,您可以增加 epoch 并进行一些最终的超参数调整,直到验证结果不再“足够”改善,其中“足够”是您的耐心和对更好结果的需要的结合。

【讨论】:

  • 非常感谢,非常感谢您的详细回复。它慢慢开始变得有意义,我会看看你发给我的链接。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2016-05-05
  • 2017-12-06
  • 1970-01-01
相关资源
最近更新 更多