You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras加载ModelCheckpoint保存的模型准确率不一致求助

解决加载ModelCheckpoint保存的模型后准确率不一致的问题

这问题我之前踩过好几次坑,大概率是几个细节没处理到位,咱们一步步来排查解决:

1. 先锁死随机性:固定所有随机种子

训练过程里的随机性(比如dropout的随机丢弃、权重初始化、数据洗牌)可能导致原模型和加载后的模型测试结果出现偏差,先把所有随机种子固定死,确保两次测试的环境完全一致:

import tensorflow as tf
import numpy as np
import random

# 固定全局随机种子
SEED = 42
random.seed(SEED)
np.random.seed(SEED)
tf.random.set_seed(SEED)
tf.keras.utils.set_random_seed(SEED)

# 如果用GPU,开启确定性操作避免硬件层面的随机波动
tf.config.experimental.enable_op_determinism()

2. 关键操作:确保测试时模型处于推理模式

像BatchNormalization、Dropout这类层在训练和推理时的行为完全不同:训练时会更新统计量/随机丢弃神经元,推理时则用训练好的固定统计量/不丢弃。如果原模型测试时没切换到推理模式,而加载后的模型默认是推理模式,结果自然会不一样。

原模型测试时的正确操作:

# 测试前明确切换到推理模式
model.trainable = False
# 或者在evaluate/predict时直接指定training=False
test_loss, test_acc = model.evaluate(test_data, test_labels, verbose=1)
# 用predict的话:
predictions = model.predict(test_data, training=False)

加载模型后的测试操作:

from keras.models import load_model

modell = load_model("Models/FVA_MEL.h5")
# 同样确保处于推理模式
modell.trainable = False
test_loss, loaded_test_acc = modell.evaluate(test_data, test_labels, verbose=1)

3. 检查模型保存/加载的完整性

尝试用SavedModel格式保存(替代.h5)

有时候.h5格式可能会丢失一些模型状态,换成TensorFlow原生的SavedModel格式试试:

# 修改ModelCheckpoint的保存配置
checkpoint = ModelCheckpoint(
    "Models/FVA_MEL",  # SavedModel是文件夹格式,不需要后缀
    monitor='val_accuracy',
    verbose=1,
    save_best_only=True,
    mode='max',
    save_format='tf'  # 指定用SavedModel格式
)

# 加载时直接读取文件夹
modell = tf.keras.models.load_model("Models/FVA_MEL")

验证原模型和加载后模型的权重是否一致

如果权重都不一样,那说明保存/加载过程有问题,可以用代码对比:

# 遍历所有层对比权重
for orig_layer, loaded_layer in zip(model.layers, modell.layers):
    orig_weights = orig_layer.get_weights()
    loaded_weights = loaded_layer.get_weights()
    for w1, w2 in zip(orig_weights, loaded_weights):
        # 检查权重是否在浮点误差允许范围内近似相等
        assert np.allclose(w1, w2, atol=1e-6), f"Layer {orig_layer.name} 的权重不匹配!"

如果断言失败,去训练日志里确认一下:ModelCheckpoint保存的是不是val_accuracy最高的那个epoch?有可能是日志显示和实际保存的epoch不匹配。

4. 确认数据预处理完全一致

这是很容易忽略的细节:

  • 原模型测试和加载后测试用的是不是完全相同的测试数据集?有没有不小心用了训练集的子集?
  • 预处理步骤(比如归一化、梅尔频谱提取的参数)是不是完全一致?比如测试数据的均值/方差是不是用训练集统计的,而不是重新计算的?
  • 测试时有没有不小心开启了数据增强?比如ImageDataGenerator里除了rescale之外的增强参数在测试时应该关闭。

5. 自定义组件的加载问题

如果你的模型里有自定义层、自定义损失函数或者自定义指标,加载时必须传入custom_objects参数,否则模型会加载不完整:

# 假设你有自定义层CustomLayer和自定义损失custom_loss
modell = load_model(
    "Models/FVA_MEL.h5",
    custom_objects={'CustomLayer': CustomLayer, 'custom_loss': custom_loss}
)

按这个流程排查下来,90%以上的概率能解决准确率不一致的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:22:33