首页 > 解决方案 > 大型模型的最佳批量大小和时期

问题描述

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

它是一种图像分类模型。目前我正在尝试对 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

标签: pythontensorflowmachine-learningkerasneural-network

解决方案


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

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

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

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


推荐阅读