You need to enable JavaScript to run this app. 为什么model.fit输出的val_accuracy与CustomCallback打印的accuracy存在差异
优惠活动
大模型
产品
解决方案
定价
更多

为什么model.fit输出的val_accuracy与CustomCallback打印的accuracy存在差异

Keras内置验证准确率与自定义回调准确率差异原因

核心原因(概率最高)

  • 验证集数据集顺序不匹配:你的CustomCallback中get_map方法是按照固定的self.files_path顺序,将pred_valid的预测结果一一对应做准确率计算,但如果你的val_ds开启了shuffle配置,或者没有固定迭代顺序,两次迭代val_ds(一次是model.fit内部做验证,一次是你回调里调用model.predict(self.val_ds))得到的样本顺序完全不同,预测结果和你本地的文件标签对应不上,自然准确率计算偏差极大。

修复方案:定义val_ds时明确设置shuffle=False,且配置tf.data.Dataset的确定性参数,保证每次迭代的样本顺序完全一致。

其他可能原因

  • 验证集包含随机数据增强:如果你给验证集也加了随机翻转、随机裁剪等训练阶段才用的随机增强算子,两次推理同一样本得到的输入不一样,预测结果也会出现差异,进一步拉大准确率偏差。

修复方案:验证集的预处理流程只保留Resize、归一化等确定性操作,移除所有随机增强逻辑。

  • 内置指标计算逻辑差异:Keras内置的准确率指标默认是batch级平均准确率,也就是每个batch的准确率计算完成后取均值,而你自定义回调里是全局样本准确率,如果你的验证集类别不平衡、且batch size较小的情况下,两种计算方式会有小幅差异,但一般不会出现0.2这么大的偏差。
  • 回调内错误修改模型状态:你在on_epoch_end中把所有层的trainable设为False,虽然trainable修改不会立即影响预测逻辑,但如果后续epoch训练前没有改回True,会导致模型后续无法正常训练,也可能间接引发指标异常。

修复方案:删除回调内修改layer.trainable的代码,该操作对你的预测逻辑完全无用,还会影响后续训练。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 13:51:03