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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:05:17