TensorFlow模型保存后加载精度大幅下降问题求助
TensorFlow模型保存后加载精度骤降的问题排查与解决
问题原因分析
Tokenizer未持久化,编码规则不一致
训练时使用的Tokenizer没有保存,加载模型时重新初始化并训练新的Tokenizer,导致文本到序列的映射规则和训练模型时完全不同,模型输入分布错乱,直接引发精度暴跌。数据集分割无固定随机种子
train_test_split未指定random_state,每次运行代码都会随机分割数据集,加载模型时的验证集和训练时的验证集并非同一批数据,无法真实反映模型实际性能。模型加载流程冗余
加载模型时先调用load_model(已包含训练好的权重),再调用load_weights重复加载,虽不直接引发问题,但属于冗余操作,可能引入潜在风险。优化器参数未正确生效
训练时创建了指定学习率的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
相关产品推荐
相关产品推荐

