tf.callbacks.ModelCheckpoint无法识别val_accuracy问题求助
问题根源与解决方法
核心问题
你的模型是多输出模型(从日志里的table_mask_loss、col_mask_loss能看出),编译时用metrics=['accuracy'],Keras会为每个输出单独生成对应的准确率指标,比如table_mask_accuracy、col_mask_accuracy,验证阶段的指标名会加上val_前缀,也就是val_table_mask_accuracy和val_col_mask_accuracy——但你在回调里监控的是val_accuracy,这个统一指标在多输出模型里根本不存在,所以会出现找不到的警告。
另外还有两个明显错误:
- 准确率是越高越好,回调的
mode应该设为"max",而非"min" - 你定义了EarlyStopping但没加到
callbacks列表里,完全没生效
具体修复步骤
1. 修正回调的监控指标与模式
根据需求选择要监控的验证准确率,同时把mode改成"max":
# 监控表格掩码的验证准确率,保存最优模型 model_checkpoint = tf.keras.callbacks.ModelCheckpoint( "table_net.h5", monitor='val_table_mask_accuracy', save_best_only=True, verbose=1, # 改成1可查看保存日志,方便排查 mode="max", save_freq='epoch' ) # 同步修正EarlyStopping es = tf.keras.callbacks.EarlyStopping( monitor='val_table_mask_accuracy', mode='max', patience=5 )
如果想监控列掩码的准确率,把monitor改成val_col_mask_accuracy即可。
2. 把EarlyStopping加入回调列表
修改model.fit的callbacks参数,让EarlyStopping生效:
history = model.fit( train_dataset, epochs=EPOCHS, steps_per_epoch=train_steps, validation_data=test_dataset, validation_steps=VALIDATION_STEPS, callbacks=[model_checkpoint, es] # 加入EarlyStopping )
3. 可选:自定义综合验证准确率
如果需要监控一个统一的综合准确率,可以在编译时自定义指标,比如对两个输出的准确率取平均:
def combined_accuracy(y_true, y_pred): # 适配多输出模型的格式,计算两个输出的准确率均值 table_acc = tf.keras.metrics.Accuracy()(y_true[0], tf.argmax(y_pred[0], axis=-1)) col_acc = tf.keras.metrics.Accuracy()(y_true[1], tf.argmax(y_pred[1], axis=-1)) return (table_acc + col_acc) / 2 model.compile( optimizer=tf.keras.optimizers.Adam(learning_rate=init_lr, epsilon=1e-8), loss=losses, metrics=[combined_accuracy] # 使用自定义综合指标 )
此时验证阶段的指标名为val_combined_accuracy,回调里直接监控这个名称即可。
4. 检查验证数据与steps设置
确保test_dataset的输出格式和模型的输入输出完全匹配,同时确认VALIDATION_STEPS的计算逻辑合理——如果数值过小,可能导致验证数据未被完整遍历,影响指标计算的完整性。
内容的提问来源于stack exchange,提问作者Pravin
相关产品推荐
相关产品推荐

