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

Keras中save_model()与load_model()方法运行结果不符合预期

问题原因分析

导致两次预测结果出现明显差异的核心原因通常是训练过程的可复现性没有得到保证,常见原因如下:

  • 训练数据随机打乱的差异:Keras的fit方法默认开启shuffle=True,每轮训练前会随机打乱训练集样本顺序。你两次执行后续15轮训练时,每个batch的样本组成完全不同,梯度计算和参数更新的路径自然存在差异,最终得到的模型权重不一致,预测结果就会有明显偏差。
  • 优化器状态未正确继承:Adam优化器会维护动量、累计梯度平方、迭代步数等内部状态,这些状态直接决定了参数更新的幅度和方向。如果保存模型时没有完整保存优化器状态,或者加载时状态被重置,加载后的模型优化器相当于重新初始化,后续训练的更新逻辑和原模型的后续训练完全不同,最终结果差异会非常明显。
  • 全局随机种子未固定:如果代码中没有固定TensorFlow、Numpy等库的全局随机种子,即便是逻辑完全一致的训练流程,也会因为底层随机操作的差异导致结果不同,虽然这个因素带来的差异通常不会有你遇到的这么大,但也是可复现性问题的常见诱因。
修复方案

你可以按照以下步骤调整代码,保证两次训练结果完全一致:

  1. 固定所有全局随机种子,在代码最开头加入以下内容:
import numpy as np
import tensorflow as tf
import random
import os

seed = 42
os.environ['PYTHONHASHSEED'] = str(seed)
random.seed(seed)
np.random.seed(seed)
tf.random.set_seed(seed)
  1. 两次后续15轮训练的fit方法都添加shuffle=False参数,保证两次训练的样本顺序完全一致:
# 原模型后续训练
model1.fit(X_train, Y_train, epochs=15, batch_size=64, verbose=0, shuffle=False)
# 加载后模型的后续训练
model2.fit(X_train, Y_train, epochs=15, batch_size=64, verbose=0, shuffle=False)
  1. 保存和加载模型时显式指定保留优化器状态,避免配置异常:
# 保存时显式开启保留优化器
keras.models.save_model(model1, f"models/initial", include_optimizer=True)
# 加载时同样显式指定加载优化器
model2 = keras.models.load_model(f"models/initial", compile=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:36:04