为什么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
相关产品推荐
相关产品推荐

