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。
相关产品推荐
相关产品推荐

