求助:如何基于Keras和TensorFlow加载已保存模型并实现预测
加载Keras训练模型并实现预测的完整步骤
嗨,我来给你一步步讲清楚怎么操作哈!首先得提醒你,训练的时候除了保存模型,一定要把训练时用的Tokenizer也保存下来,不然预测时文本预处理的规则和训练时不一致,结果肯定不准。
第一步:训练阶段先保存Tokenizer和模型
你之前训练完模型后,除了用代码保存模型,还要把Tokenizer存成文件,这样预测时能直接复用训练时的文本编码规则:
import pickle from tensorflow.keras.models import load_model # 训练完Tokenizer之后立刻保存它 with open('tokenizer.pickle', 'wb') as handle: pickle.dump(tokenize, handle, protocol=pickle.HIGHEST_PROTOCOL) # 同时保存训练好的完整模型 model.save('stackoverflow_text_model.h5')
第二步:创建预测脚本,加载模型和Tokenizer
新建一个比如predict_post_tag.py的文件,先把之前保存的模型和Tokenizer加载进来:
from tensorflow.keras.models import load_model import pickle from tensorflow.keras.preprocessing import text # 加载训练好的Keras模型 model = load_model('stackoverflow_text_model.h5') # 加载保存的Tokenizer,保证文本编码规则和训练时一致 with open('tokenizer.pickle', 'rb') as handle: tokenize = pickle.load(handle)
第三步:预处理待预测的文本
你要预测的文本(比如你例子里的"angular expression in ng-re...")需要和训练时的预处理步骤完全同步:
# 待预测的Stack Overflow帖子文本 txt = "angular expression in ng-repeat not working as expected" # 用Tokenizer把文本转换成模型能识别的序列 txt_sequence = tokenize.texts_to_sequences([txt]) # 对序列做padding(这里的max_len必须和你训练时设置的完全一样,别改数值) from tensorflow.keras.preprocessing.sequence import pad_sequences max_len = 200 # 替换成你训练时实际设置的最大序列长度 txt_padded = pad_sequences(txt_sequence, maxlen=max_len)
第四步:执行预测并解析结果
现在就可以用加载好的模型做预测,然后把模型输出的概率转换成你能看懂的标签:
# 运行预测,得到每个分类标签的概率分布 predictions = model.predict(txt_padded) # 这里替换成你训练时实际用的分类标签列表,比如Stack Overflow的技术标签 labels = ['angular', 'python', 'javascript', 'java', 'react'] # 找到概率最高的标签 predicted_label = labels[predictions.argmax(axis=1)[0]] print(f"这个帖子预测的标签是:{predicted_label}") print(f"各标签的预测概率:{dict(zip(labels, predictions[0]))}")
关键注意事项
- 所有预处理参数(
max_words、max_len、是否做小写转换等)必须和训练阶段完全一致,不然模型会报错或者输出错误结果。 - 如果训练时对文本做了额外处理(比如去除特殊字符、停用词),预测时也要对输入文本执行同样的操作。
内容的提问来源于stack exchange,提问作者user9550188
相关产品推荐
相关产品推荐

