def nms(bboxes,scores,threshold=0.5):
'''
bboxes(tensor) [N,4]
scores(tensor) [N,]
'''
x1 = bboxes[:,0]
y1 = bboxes[:,1]
x2 = bboxes[:,2]
y2 = bboxes[:,3]
areas = (x2-x1) * (y2-y1)
_,order = scores.sort(0,descending=True)
keep = []
while order.numel() > 0:
i = order[0]
keep.append(i)
if order.numel() == 1:
break
xx1 = x1[order[1:]].clamp(min=x1[i])
yy1 = y1[order[1:]].clamp(min=y1[i])
xx2 = x2[order[1:]].clamp(max=x2[i])
yy2 = y2[order[1:]].clamp(max=y2[i])
w = (xx2-xx1).clamp(min=0)
h = (yy2-yy1).clamp(min=0)
inter = w*h
ovr = inter / (areas[i] + areas[order[1:]] - inter)
ids = (ovr<=threshold).nonzero().squeeze()
if ids.numel() == 0:
break
order = order[ids+1]
return torch.LongTensor(keep)
我试过了
i=order.item()
但是不起作用
我在github问题中找到了解决方案这里
尝试改变
i = order[0] # works for PyTorch 0.4.1.
到
i = order # works for PyTorch>=0.5.
我尝试使用 PyTorch 在 MNIST 上运行标准卷积神经网络(LeNet)。我收到此错误
IndexError Traceback (most recent call last
79 y = net.forward(train_x, dropout_value)
80 loss = net.loss(y,train_y,l2_regularization)
81 loss_train = loss.data[0]
82 loss_train += loss_val.data
IndexError: invalid index of a 0-dim tensor. Use tensor.item() to convert a
0-dim tensor to a Python number
改变
loss_train = loss.data[0]
至
loss_train = loss.data
解决了问题。
您应该将循环体更改为:
while order.numel() > 0:
if order.numel() == 1:
break
i = order[0]
keep.append(i)
当
i = order[0]
中只剩下一个元素时,代码 order
会出错。
我在下面遇到了同样的错误:
IndexError:0 维张量的索引无效。在 Python 中使用
或在 C++ 中使用tensor.item()
将 0 维张量转换为数字tensor.item<T>()
当我尝试使用索引访问 0D 张量的元素时,如下所示:
import torch
my_tensor = torch.tensor(7) # 0D tensor
my_tensor[0] # Error
所以,我使用了 item(),然后我就可以得到 0D 张量的元素,如下所示:
import torch
my_tensor = torch.tensor(7) # 0D tensor
my_tensor.item() # 7