Pytorch获取train_loop准确率无效

我想获取我的神经网络训练部分的准确率,但出现了以下错误:
correct += (prediction.argmax(1) == y).type(torch.float).item()
ValueError: only one element tensors can be converted to Python scalars
这是我的代码:

def train_loop(dataloader, model, optimizer):
    model.train()
    size = len(dataloader.dataset)
    correct = 0, 0
    l_loss = 0
    for batch, (X, y) in enumerate(dataloader):
        prediction = model(X)
        loss = cross_entropy(prediction, y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        correct += (prediction.argmax(1) == y).type(torch.float).sum().item()
        loss, current = loss.item(), batch * len(X)
        l_loss = loss
        print(f"loss: {loss:>7f}  [{current:>5d}/{size:>5d}]")
    correct /= size
    accu = 100 * correct
    train_loss.append(l_loss)
    train_accu.append(accu)
    print(f"Accuracy: {accu:>0.1f}%")

我不明白为什么它不起作用,因为在我的测试部分,使用完全相同的代码行时运行得很好。


回答:

item 函数用于将单元素张量转换为标准的Python数字,如这里所述。请确保在使用item()之前,sum()的结果只是一个单元素张量。

x = torch.tensor([1.0,2.0]) # 包含2个元素的张量
x.item()

错误信息:ValueError: only one element tensors can be converted to Python scalars

尝试使用以下代码:

prediction = prediction.argmax(1)
correct = prediction.eq(y)
correct = correct.sum()
print(correct) # 检查是否为单值张量
correct_sum += correct.item()

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注