如何在同一张图中绘制训练、验证及测试集的损失曲线?
如何在损失曲线中添加测试集损失?
当然可以实现训练、验证、测试集三者损失同图展示!正如你发现的,model.fit()默认只会追踪训练和验证集的损失指标,所以history.history里确实没有test_loss字段——我们只需要手动在每个epoch结束后计算测试集损失并记录下来,就能把它加到曲线里了。
下面是具体的实现步骤:
1. 准备存储测试损失的容器
先初始化一个空列表,用来保存每个epoch结束后的测试集损失:
test_losses = [] total_epochs = 10
2. 逐epoch训练并记录测试损失
不要一次性训练完所有epoch,而是用循环逐轮训练,每完成一个epoch就评估一次测试集的损失并保存:
for epoch in range(total_epochs): print(f"正在训练第 {epoch+1}/{total_epochs} 个epoch...") # 仅训练当前这一个epoch current_history = model.fit( x=X_train, y=y_train, epochs=epoch+1, initial_epoch=epoch, validation_data=(X_val, y_val), batch_size=128, verbose=1 ) # 评估测试集损失(verbose=0 关闭评估过程的输出) test_loss, _ = model.evaluate(X_test, y_test, verbose=0) test_losses.append(test_loss)
这里的关键是用initial_epoch和epochs参数控制每次只训练一个epoch,这样我们才能在每轮结束后及时评估测试集。model.evaluate()会返回(损失值,准确率),所以我们只取第一个结果就是测试损失。
3. 绘制包含三者的损失曲线
最后把训练、验证、测试的损失曲线都画到同一张图里:
from matplotlib import pyplot as plt plt.plot(current_history.history['loss']) # 训练集损失曲线 plt.plot(current_history.history['val_loss']) # 验证集损失曲线 plt.plot(test_losses) # 测试集损失曲线 plt.title('Model Loss Across Epochs') plt.ylabel('Loss Value') plt.xlabel('Epoch') plt.legend(['Train', 'Validation', 'Test'], loc='upper left') plt.show()
小提醒
- 不要在训练过程中太频繁地用测试集评估,虽然这里是为了绘图,但实际训练中过度关注测试集可能导致过拟合测试集的情况。
- 如果你的数据集很大,
model.evaluate()可能会花一点时间,可以根据需求调整评估的频率(比如每2个epoch评估一次)。
内容的提问来源于stack exchange,提问作者PolarBear10




