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

TensorFlow模型保存后加载精度大幅下降问题求助

TensorFlow模型保存后加载精度骤降的问题排查与解决

问题原因分析

  1. Tokenizer未持久化,编码规则不一致
    训练时使用的Tokenizer没有保存,加载模型时重新初始化并训练新的Tokenizer,导致文本到序列的映射规则和训练模型时完全不同,模型输入分布错乱,直接引发精度暴跌。

  2. 数据集分割无固定随机种子
    train_test_split未指定random_state,每次运行代码都会随机分割数据集,加载模型时的验证集和训练时的验证集并非同一批数据,无法真实反映模型实际性能。

  3. 模型加载流程冗余
    加载模型时先调用load_model(已包含训练好的权重),再调用load_weights重复加载,虽不直接引发问题,但属于冗余操作,可能引入潜在风险。

  4. 优化器参数未正确生效
    训练时创建了指定学习率的Adam优化器,但未赋值给变量,直接使用optimizer='Adam'会调用默认参数的Adam,导致实际训练的学习率与预期不符。

解决方案

1. 保存并复用Tokenizer

训练完成后用pickle保存Tokenizer,加载模型时直接复用相同的编码规则:

# 训练阶段添加保存Tokenizer的代码
import pickle
# ...训练完成后执行
with open('models/emotions/tokenizer.pkl', 'wb') as f:
    pickle.dump(tokenizer, f)

# 加载模型阶段替换Tokenizer初始化代码
import pickle
with open('models/emotions/tokenizer.pkl', 'rb') as f:
    tokenizer = pickle.load(f)
# 直接生成序列,无需再次执行fit_on_texts
seq_train = tokenizer.texts_to_sequences(text_train)
seq_val = tokenizer.texts_to_sequences(text_val)
padded_train = pad_sequences(seq_train)
padded_val = pad_sequences(seq_val)

2. 固定数据集分割的随机种子

给train_test_split添加random_state参数,确保每次运行代码时数据集分割结果一致:

text_train, text_val, label_train, label_val = train_test_split(
    text, label, test_size=TEST_SIZE, random_state=42
)

3. 简化模型加载流程

load_model会加载完整的模型(包括权重和编译配置),无需重复加载权重:

# 加载模型时的简化代码
model = tf.keras.models.load_model("models/emotions/net")
loss, accuracy = model.evaluate(padded_val, label_val)

4. 修正优化器参数设置

确保指定学习率的Adam优化器正确生效:

# 训练阶段修正优化器代码
optimizer = Adam(learning_rate=LEARNING_RATE, name='Adam')
model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics='categorical_accuracy')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:45:03