Transformer翻译模型实现时遇IndexError索引越界问题求助
解决Transformer翻译模型的IndexError: Index out of range in self问题
以下是几个高频触发该错误的场景及排查方法:
- 词嵌入层索引越界:确认
Embedding层的词表大小参数和实际使用的词表完全匹配。比如你源语言词表实际有8000个token,但初始化嵌入层时填了7000,当输入中出现大于等于7000的token索引时,就会触发错误。可以在嵌入层前加一行代码打印输入token的最大值:print("Max token index:", torch.max(input_ids)),对比词表大小减一(索引从0开始)。 - 多头注意力维度不兼容:Transformer要求模型维度
d_model必须能被注意力头数num_heads整除。比如d_model=512、num_heads=8是合法的,但如果设成num_heads=7,拆分注意力头时会出现维度计算错误,进而引发索引问题。检查多头注意力模块里的d_k = d_model // num_heads,确保整除后没有余数。 - 数据输入维度错乱:检查数据预处理后的张量形状是否符合模型预期。比如模型期望输入是
(batch_size, seq_len),但实际传入的是(seq_len, batch_size),后续层的索引操作就会越界。在模型前向传播的第一行打印输入形状:print("Input shape:", x.shape),和模型设计的输入维度对比。 - 位置编码与嵌入维度不匹配:位置编码的输出维度必须和词嵌入的
d_model一致,否则两者相加时会触发维度错误,间接导致索引越界。检查位置编码类的输出张量形状,确保和嵌入层输出形状完全相同。
调试小技巧:
- 在触发错误的代码行附近,打印涉及的所有张量的形状和关键参数值,比如
self.weight.shape和要索引的index取值范围,直接定位哪个环节的维度不匹配。 - 逐步注释掉模型的部分模块(比如先屏蔽注意力层,只跑嵌入+位置编码),缩小错误范围,快速定位到出问题的组件。
内容的提问来源于stack exchange,提问作者Mahir RAfid
相关产品推荐
相关产品推荐

