首先该问题明显是一个越界问题,所以我们使用pycharm单步调试
调试至这一步时,仍可以正常查看tensor的具体值
for i, seq in enumerate(result_seqs):
if seq[-1] == EOS_ID:
finished_id.append(i)
finished_seqs.append(seq)
else:
continue_id.append(i)
continue_seqs.append(seq)
if _n_gram_overlap(seq, n_gram):
log_probs[i,:] = -1e10
new_beam_width = len(continue_id)
reordered_id = continue_id + finished_id
result_seqs = continue_seqs + finished_seqs
# TODO:这里会报错,但不知道为什么
# 断点位置
return result_seqs, log_probs[reordered_id], new_beam_width
此时log_probs是一个(1,5)的向量,reordered_id是一个长度为5的列表,按照pytorch默认对第一维度进行索引的原则,显然发生了数组越界(5>1)。
Reproduction:
a=torch.tensor([[18.2311, 18.0072, 17.9995, 17.6672, 17.4626]], device='cuda:0')
l_index=[0,1,2,3,4]
print(a[l_index])
相同的错误被抛出: