You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在同一张图中绘制训练、验证及测试集的损失曲线?

如何在损失曲线中添加测试集损失?

当然可以实现训练、验证、测试集三者损失同图展示!正如你发现的,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_epochepochs参数控制每次只训练一个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

火山引擎 最新活动