PyTorch运行LSTM槽位标注任务报IndexError: index out of range in self求解
问题根因定位与修复方案
1. 直接报错原因:词嵌入索引越界
从给出的运行信息可以直接定位触发报错的核心原因:
- 模型的词嵌入层为
Embedding(1148, 560),即词汇表总大小为1148,合法的索引取值范围是 0~1147 - 输入的
inputs张量中存在大量1150的数值,已经超出嵌入层的合法索引范围,因此触发IndexError
异常索引来源排查
该问题通常是序列填充逻辑导致的:你在做句子长度统一填充时,用的<PAD>填充标记没有加入到vocab2sent词表中,或是填充用的索引值设置超出了词表的大小范围。
修复方案
- 将填充标记
<PAD>加入vocab2sent词表,确保它的编号小于1148 - 若存在未登录词(OOV)的场景,同时预留OOV标记的词表位置,所有不在词表中的词统一映射到OOV的合法索引,不要直接使用超出词表范围的编号
- 若不需要调整词表,初始化模型时将词表大小参数改为
len(vocab2sent) + 特殊标记数量,例如仅用到PAD和OOV两个特殊标记就加2
2. 代码隐藏逻辑错误
解决索引越界问题后还会触发损失计算报错,需要同步修改:
原损失计算代码写错了入参:
loss = loss_function(sentence_in, targets)
nn.NLLLoss的第一个入参要求传入模型输出的预测结果tag_scores,不是输入句子张量sentence_in,修改为如下即可:
loss = loss_function(tag_scores, targets)
3. 可选优化建议
你测试推理阶段存在两处数据处理逻辑不一致的问题:第一次推理直接用torch.tensor(training_data[0][0])转张量,第二次推理用了prepare_sequence工具函数,建议统一前后处理逻辑,避免出现索引不匹配的问题。
内容的提问来源于stack exchange,提问作者Parsh
相关产品推荐
相关产品推荐

