RuntimeError range.second - range.first == t.size() INTERNAL ASSERT FAILED at .XXXX

本文讲述了如何解决在PyTorch中使用tensor下标时遇到的RuntimeError,重点讲解了detach()方法在防止梯度传播上的作用。通过实例和解决方法,帮助读者避免此类莫名其妙的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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(),阻断了梯度的传播,就不用再计算出错啦~ヾ(*´▽‘*)ノ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值