Keras如何仅保存最优模型并获取其损失、精度等指标
解决方法
方法1:从训练history中定位最优轮次的指标
因为你用ModelCheckpoint时指定了monitor='val_loss'且save_best_only=True,最优模型对应验证损失最小的轮次,直接从训练返回的history里提取即可:
- 训练时保留history对象:
history = model.fit( x_train, y_train, validation_data=(x_val, y_val), epochs=50, callbacks=[checkpoint] )
- 找到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
相关产品推荐
相关产品推荐

