You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras如何仅保存最优模型并获取其损失、精度等指标

解决方法

方法1:从训练history中定位最优轮次的指标

因为你用ModelCheckpoint时指定了monitor='val_loss'且save_best_only=True,最优模型对应验证损失最小的轮次,直接从训练返回的history里提取即可:

  1. 训练时保留history对象:
history = model.fit(
    x_train, y_train,
    validation_data=(x_val, y_val),
    epochs=50,
    callbacks=[checkpoint]
)
  1. 找到val_loss最小的轮次索引,提取对应指标:
import numpy as np

# 找到验证损失最小的轮次索引(epoch从0开始计数)
best_epoch_idx = np.argmin(history.history['val_loss'])

# 提取最优轮次的各项指标
best_loss = history.history['loss'][best_epoch_idx]
best_acc = history.history['acc'][best_epoch_idx]
best_val_loss = history.history['val_loss'][best_epoch_idx]
best_val_acc = history.history['val_acc'][best_epoch_idx]

# 可以打印查看
print(f"最优模型对应轮次:{best_epoch_idx+1}")
print(f"训练损失:{best_loss:.4f},训练精度:{best_acc:.4f}")
print(f"验证损失:{best_val_loss:.4f},验证精度:{best_val_acc:.4f}")

注意:如果你的monitor是val_acc(要最大化精度),就把np.argmin换成np.argmax。


方法2:自定义Callback实时记录最优指标

如果想更灵活(比如和ModelCheckpoint同步触发记录),可以写一个自定义回调类,每次保存最优模型时自动记录当前指标:

from tensorflow.keras.callbacks import Callback
import numpy as np

class BestMetricsLogger(Callback):
    def __init__(self, monitor='val_loss', mode='auto'):
        super().__init__()
        self.monitor = monitor
        # 根据monitor类型确定比较逻辑
        if mode == 'auto':
            self.monitor_op = np.less if 'loss' in monitor else np.greater
            self.best = np.Inf if 'loss' in monitor else -np.Inf
        elif mode == 'min':
            self.monitor_op = np.less
            self.best = np.Inf
        elif mode == 'max':
            self.monitor_op = np.greater
            self.best = -np.Inf
        self.best_metrics = None

    def on_epoch_end(self, epoch, logs=None):
        current = logs.get(self.monitor)
        if current is None:
            return
        # 当前指标更优时,保存所有指标
        if self.monitor_op(current, self.best):
            self.best = current
            self.best_metrics = {
                'epoch': epoch + 1,  # 转成从1开始的轮次数
                'loss': logs['loss'],
                'acc': logs['acc'],
                'val_loss': logs['val_loss'],
                'val_acc': logs['val_acc']
            }

使用时和ModelCheckpoint一起传入fit:

# 只保存最优模型,文件名简洁
checkpoint = ModelCheckpoint('best_model.h5', verbose=0, monitor='val_loss', save_best_only=True, mode='auto')
# 实例化自定义回调
metrics_logger = BestMetricsLogger(monitor='val_loss', mode='auto')

# 开始训练
history = model.fit(
    x_train, y_train,
    validation_data=(x_val, y_val),
    epochs=50,
    callbacks=[checkpoint, metrics_logger]
)

# 训练结束后直接获取最优指标
print("最优模型指标:", metrics_logger.best_metrics)

两种方法都不用把指标塞进文件名,也能精准拿到最优模型对应的各项数值。

内容的提问来源于stack exchange,提问作者radek04

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:46:33