IndexError:0 维张量的索引无效。使用tensor.item()将0维张量转换为Python数字

问题描述 投票:0回答:4
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()

但是不起作用

python-3.x pytorch
4个回答
24
投票

我在github问题中找到了解决方案这里

尝试改变

i = order[0] # works for PyTorch 0.4.1.

i = order # works for PyTorch>=0.5.

11
投票

我尝试使用 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

解决了问题。


2
投票

您应该将循环体更改为:

while order.numel() > 0:
        if order.numel() == 1:
            break
        i = order[0]
        keep.append(i)

i = order[0]
中只剩下一个元素时,代码
order
会出错。


0
投票

我在下面遇到了同样的错误:

IndexError:0 维张量的索引无效。在 Python 中使用

tensor.item()
或在 C++ 中使用
tensor.item<T>()
将 0 维张量转换为数字

当我尝试使用索引访问 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
© www.soinside.com 2019 - 2024. All rights reserved.