我对Keras/Tensorflow领域还比较新手,目前正在通过使用现有的Keras教程模型并尝试修改它们来学习。我选择了图像分类任务,因为如果我能掌握整个流程,这就是我最终需要的应用;)
情况: 我收集了20,000张室内和室外的公寓和房屋图片,以便将它们分类为室内/室外图片。我逐步修改使用的模型目前准确率为95.2%,但我想尝试达到更高的准确率。
问题: 在我的电脑上,运行50个epoch的训练和测试,批量大小为128,图片尺寸为256×256,大约需要24小时。这意味着,检查模型修改是否能合理改善结果需要花费无尽的时间。
例如,降低批量大小、使用更小的图片或减少epoch数会导致模型准确率降低。减少epoch对测试运行和完整运行之间的差异影响较小,但最终,如果模型需要12小时或24小时来训练,如果我想检查修改是否有积极效果,这并不重要。
我的问题: 你如何检查对模型的更改是否倾向于提高准确率?使用仅几张图片的测试运行?将epoch数减少到非常低的数字?我测试了一些方法,但每次在图片数量、图片分辨率、epoch等方面降低复杂度时,“测试运行”大多数时候并不能指示完整运行的最终准确率。例如,测试运行表现较差而完整运行表现更好,反之亦然。
有什么建议吗?将不胜感激!
回答:
最简单的答案可能是购买并安装一个GPU。价格已经下降了,所以你可以用不太多的成本获得更短的训练时间。然而,考虑到你的现状,使用两个Keras回调函数可能会有助于减少训练时间。第一个是ReduceLROnPlateau。文档在这里。这个回调可以设置为监控验证损失。如果验证损失在’patience’个epoch内未能降低,学习率将按“factor”因子降低,其中因子是一个小于1的数字。使用这个回调,应该可以从更高的学习率开始,并在早期epoch中更快地收敛,然后根据需要自动降低学习率。第二个回调是EarlyStopping。文档在这里。它可以设置为监控验证损失,并在损失在’patience’个epoch内未能改善时终止训练。这将防止你运行不会进一步改善性能的epoch。在回调中使用参数restore_best_weights=True,在训练结束时,你的模型将具有验证损失最低的那个epoch的权重。我推荐的回调设置如下所示
rlronp=f.keras.callbacks.ReduceLROnPlateau(monitor="val_loss", factor=0.5, patience=1) estop=tf.keras.callbacks.EarlyStopping(monitor="val_loss",patience=3,restore_best_weights=True)callbacks=[rlronp, estop]
然后在model.fit中包含callbacks=callbacks