今天跑网络的时候遇见了这么一个错误:

Exception has occurred: RuntimeError

range.second - range.first == t.size() INTERNAL ASSERT FAILED at .XXXX , please report a bug to PyTorch. inconsistent range for TensorList output (copy_range at .XXX)

在百度和bing找了半天没找到相关解释,最后还是google给力,丢一个解决问题的​​链接​

其实主要原因还是在于网络里出现了利用tensor 作为下标索引,但是并没有将其计算梯度的属性置为False,比如如下例子

import torch
t1 = torch.tensor([[1, 2], [3,4]]).float().requires_grad_()
t2 = torch.argmin(t1, dim=1)
t3 = t1[t2]
t3.sum().backward()

t2也是一个tensor,但是t3是获取t1中以t2为下标的数据,这里的t2显然不需要计算梯度嘛,但是你必须得告诉torch,这里不要算,否则这个憨憨就会去算,并且还会报个让人摸不着头脑的错= =

解决方法当然也很简单,将上述代码修改为

import torch
t1 = torch.tensor([[1, 2], [3,4]]).float().requires_grad_()
t2 = torch.argmin(t1, dim=1)
t3 = t1[t2.detach()]
t3.sum().backward()

其实就是t2 修改为了  t2.detach(),阻断了梯度的传播,就不用再计算出错啦~ヾ(*´▽‘*)ノ