Keras LSTM模型调用model.predict触发ValueError输入维度不匹配
问题解答
首先明确:你确实需要将输入ids的序列长度填充到500以匹配训练规格,同时还需要补充样本维度,两个修改点共同解决报错问题
报错原因
你的模型输入要求是形状为(样本数, 序列长度=500, 特征数=5)的3维张量,而你当前的预测输入形状为(4,5),存在两个不符合要求的点:
- 序列长度只有4,远小于要求的500
- 缺少样本维度,输入为2维张量,不符合模型3维输入的要求
具体解决步骤
- 统一序列长度
对转换得到的ids序列做对齐处理,和你训练阶段的填充/截断策略保持一致即可:- 序列长度小于500时,在序列前/后补全值为0的
[0,0,0,0,0]特征数组,直到总长度为500 - 序列长度大于500时,截断保留最后500个序列元素即可(下一个元素预测任务保留最近上下文效果更优)
- 序列长度小于500时,在序列前/后补全值为0的
- 补充样本维度
单样本预测时,需要在0轴新增一个样本维度,将形状为(500,5)的数组转换为(1,500,5)的3维张量,匹配模型输入要求
修改后的预测函数参考
import numpy as np from tensorflow.keras.preprocessing.sequence import pad_sequences def predict(text): text = text.split(" ") ids = [] for i in text: ids.append(texids[np.where(textfull == i)][0]) # 第一步:填充/截断到序列长度500,padding和truncating参数和训练时保持一致即可 ids = pad_sequences([ids], maxlen=500, padding='pre', truncating='pre', value=[0,0,0,0,0])[0] # 第二步:新增样本维度,转成3维张量 ids = np.expand_dims(ids, axis=0) print(ids.shape) # 输出应为 (1, 500, 5) pred = model.predict(x = ids) # 后续可添加id转文本的逻辑返回可读预测结果 return pred
内容的提问来源于stack exchange,提问作者Dadu Khan
相关产品推荐
相关产品推荐

