You need to enable JavaScript to run this app. Keras单Epoch训练时如何在每个Batch后获取训练指标历史
优惠活动
大模型
产品
解决方案
定价
更多

Keras单Epoch训练时如何在每个Batch后获取训练指标历史

实现Keras逐batch粒度记录训练指标

为什么你现在拿不到中间值

Keras默认内置的History回调仅会在每个epoch训练完全结束后,把对应的聚合指标写入返回的history.history字典。训练过程中控制台逐行滚动显示的batch级损失、准确率,是临时输出的动态值,根本不会被自动存入History对象——哪怕你只设置1个epoch,也只能拿到这个epoch结束时的单组最终指标,没法提取中间N个batch的逐次数值。

具体实现方式

不需要改写模型结构或者训练流程,通过自定义回调类,拦截每个batch训练结束的钩子事件,逐次采集对应的指标值即可,拿到的数值和控制台实时显示的完全一致。

  • 第一步:导入Keras的回调基类
    from keras.callbacks import Callback
    
  • 第二步:编写自定义指标采集器,在batch结束的触发钩子里收集指标
    class BatchMetricsRecorder(Callback):
        def on_train_begin(self, logs=None):
            # 初始化两个列表,分别存储逐batch的训练损失、训练准确率
            self.batch_loss_list = []
            self.batch_acc_list = []
    
        def on_train_batch_end(self, batch_step, logs=None):
            # 每个batch训练完成时自动触发,从系统传入的logs字典提取当前batch的指标
            logs = logs or {}
            self.batch_loss_list.append(logs.get("loss"))
            self.batch_acc_list.append(logs.get("accuracy"))
    
  • 第三步:把实例化的采集器传入model.fit的回调参数,正常执行训练
    # 实例化自定义采集器
    recorder = BatchMetricsRecorder()
    
    history = model.fit(
        [x], y,
        validation_split=0.2,
        epochs=1,
        batch_size=2,
        # 挂载自定义回调
        callbacks=[recorder]
    )
    
    # 训练跑完后直接读取列表,就能拿到所有中间batch的数值
    print("逐batch训练损失:", recorder.batch_loss_list)
    print("逐batch训练准确率:", recorder.batch_acc_list)
    

注意事项

  • 这种方式采集到的指标,和控制台实时打印的逐batch数值完全同源,不存在计算偏差。
  • Keras默认的验证集评估是按epoch粒度触发的,如果需要逐batch的验证集指标,需要在自定义回调中手动在对应钩子上触发验证逻辑,训练侧的batch指标可以直接从logs字典中读取。
  • 不需要调整原训练代码的其他参数,只要传入自定义回调就能正常记录所有中间batch的数值,对训练过程本身没有任何影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 12:54:01