python - 大型模型的最佳批量大小和时期
问题描述
我知道有许多相关的问题,但我希望有人可以针对我正在尝试构建的模型提供一些建议。
它是一种图像分类模型。目前我正在尝试对 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
解决方案
您应该只在模型不再“学习”时才中断训练过程,这意味着验证数据的损失和准确性不会提高。为此,您可以放置任意数量的 epoch,并使用tf.keras.callbacks.EarlyStopping
(文档)。当满足某个条件时,这将中断训练过程,例如当val_loss
10 个 epoch 没有减少时。
es = EarlyStopping(monitor='val_loss', patience=10)
fit_generator(... callbacks=[es])
这将确保模型仍在学习时不会中断学习过程,并且模型不会过拟合。
批量大小为 32 是标准的,但这是一个与另一个站点更相关的问题,因为它与统计信息有关(并且争论非常激烈)。
推荐阅读
- django - 如何在使用 django rest 框架的简单 jwt 身份验证中验证访问令牌并在过期时将用户重定向到 refreshtoen 视图
- pyqt - PYQT 为 QTabWidget 中的每个选项卡设置不同的背景颜色
- c - 无法识别此代码的问题
- php - 排序数组连接到其他数组
- postgresql - INSERT ... RETURNING 仅在第一次插入后返回
- excel - 通过 Excel 公式在新 Outlook (Office 365) 中分离用户名和邮件地址
- java - 如何将spring boot连接到sql server management studio
- ruby-on-rails - 坚持 2FA 的 Capybara 会话
- c# - Microsoft Graph API - 从用户获取服务主体的分配 ID
- arrays - 使用部分文本或包含过滤器的 Jmeter JMESPath 提取