NLU聊天机器人多意图训练后Sequential模型输入形状不兼容问题
修复NLU聊天机器人输入形状不匹配的问题
问题根源
训练模型时的输入特征维度(词汇表映射后的向量长度)和聊天机器人运行时生成的输入维度不匹配。新增意图后训练数据的词汇量发生变化,但推理阶段未同步更新词汇表和输入处理逻辑,导致模型预期9维输入,实际传入了40维。
具体修复步骤
1. 训练时保存词汇表
在training.py中,训练完成后必须同步保存生成的词汇表(words列表),不能只保存模型。用pickle实现即可:
# training.py 训练结束后添加以下代码 import pickle with open('words.pkl', 'wb') as file: pickle.dump(words, file)
2. 推理时加载训练用的词汇表
在chatbot.py中,加载模型的同时必须加载训练阶段保存的words.pkl,禁止重新生成词汇表(否则会因数据不一致导致向量长度不符):
# chatbot.py 加载模型的代码块 import pickle from tensorflow.keras.models import load_model # 先加载训练时的词汇表 with open('words.pkl', 'rb') as file: words = pickle.load(file) # 再加载训练好的模型 model = load_model('chatbot_model.h5')
3. 统一输入向量生成逻辑
训练和推理阶段生成输入向量的代码必须完全一致。比如训练时的输入处理函数是这样:
# training.py 中的bag_of_words函数 def bag_of_words(sentence, words): bag = [0] * len(words) tokenized_sentence = nltk.word_tokenize(sentence) tokenized_sentence = [lemmatizer.lemmatize(word.lower()) for word in tokenized_sentence] for word in tokenized_sentence: for idx, w in enumerate(words): if w == word: bag[idx] = 1 return np.array(bag)
那chatbot.py里必须复用完全相同的函数处理用户输入,不能修改len(words)相关逻辑,确保生成的向量长度和训练时一致。
4. 重新训练验证
- 删除旧的
words.pkl和模型文件 - 运行
training.py重新训练,确保新词汇表和模型同步保存 - 启动
chatbot.py测试输入,确认形状匹配问题解决
额外检查项
- 排查
Intents.json中是否存在特殊字符或未处理的词汇,导致训练时词汇表异常增长 - 确认训练和推理阶段使用的词形还原工具(比如nltk的WordNetLemmatizer)是同一个,初始化方式完全一致
内容的提问来源于stack exchange,提问作者Aziziz14
相关产品推荐
相关产品推荐

