Keras模型跨会话保存与加载后精度大幅下降问题求助
解决跨会话加载Keras模型后精度骤降的问题
我之前也碰到过一模一样的情况——同会话内保存加载模型完全正常,但换个会话加载后精度直接跳水,看起来像个没训练过的模型。结合你的描述,咱们一步步来排查解决:
最可能的原因:数据预处理不一致
你提到两个模型的权重一致,但结果天差地别,90%的概率是你在会话2中使用的train_padded和训练时的输入数据不是同一个东西。
训练时你肯定用了Tokenizer把文本转换成序列,再做padding操作。如果会话2里没有复用训练时的那个Tokenizer,而是重新拟合了一个(哪怕用的是同一批训练数据),生成的词汇表可能会有细微差异,导致同样的文本转换成的序列完全不同,模型自然无法给出正确预测。
解决步骤:
- 训练时保存Tokenizer:
import pickle # 假设你训练时用了这样的Tokenizer(根据你的实际代码调整) tokenizer = tf.keras.preprocessing.text.Tokenizer(num_words=vocab_size) tokenizer.fit_on_texts(train_texts) # 保存Tokenizer到文件 with open('tokenizer.pkl', 'wb') as f: pickle.dump(tokenizer, f)
- 会话2中加载Tokenizer并复用:
import pickle # 先加载训练时保存的Tokenizer with open('tokenizer.pkl', 'rb') as f: tokenizer = pickle.load(f) # 用同一个Tokenizer生成padded数据,确保和训练时的参数完全一致 train_sequences = tokenizer.texts_to_sequences(train_texts) train_padded = tf.keras.preprocessing.sequence.pad_sequences( train_sequences, maxlen=train_padded.shape[1], # 和训练时的输入长度保持一致 padding='post', # 这里要和你训练时的padding参数完全匹配! truncating='post' )
其他排查方向
如果上面的方法解决不了,再试试下面的步骤:
1. 改用SavedModel格式保存模型
H5格式有时候会丢失一些模型配置细节,改用TensorFlow的SavedModel格式更可靠:
- 训练时保存:
model.save('my_trained_model') # 会生成一个文件夹
- 会话2中加载:
model = tf.keras.models.load_model('my_trained_model')
2. 确认推理时关闭训练模式
虽然Keras的evaluate默认是推理模式(自动禁用Dropout),但可以手动确保:
model.trainable = False scores = model.evaluate(train_padded, training_labels, verbose=0)
3. 验证权重一致性
如果还是有问题,打印模型权重的统计值(比如均值)对比会话1保存前和会话2加载后:
- 会话1保存前:
for layer in model.layers: weights = layer.get_weights() if weights: print(f"Layer {layer.name} weight mean: {weights[0].mean()}")
- 会话2加载后:
for layer in model.layers: weights = layer.get_weights() if weights: print(f"Layer {layer.name} weight mean: {weights[0].mean()}")
如果权重均值完全一致,那绝对是输入数据的问题,回到第一步仔细检查预处理流程。
内容的提问来源于stack exchange,提问作者AmaniAli
相关产品推荐
相关产品推荐

