【问题标题】:How to get probability of each image belonging to a class如何获得每个图像属于一个类的概率
【发布时间】:2020-03-05 02:00:55
【问题描述】:

我是 Pytorch 的新手。我训练并测试了一个线性分类器(nn.Linear),它的图像数据集有 8 个类别,batch_size = 35。 在测试时,我想看看给定图像属于这 8 个类别中的任何一个的概率是多少。这就是我打印 output.data 变量的原因。但是这些数字都在 1 以上,并且它们的总和不等于 1。(我附上了测试代码) 那么,我的问题是这些数字是什么意思?

谢谢!

correct = 0
total = 0
with torch.no_grad():
    for data in dataloaders['test']:
        images, labels = data[0].to(device), data[1].to(device)
        outputs = model(images)
        print(outputs.data)

        _, predicted = torch.max(outputs.data, 1)
        print(predicted)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()
print('Accuracy of the network on the 4000 test images: %d %%' % (
100 * correct / total))

【问题讨论】:

  • 可以发一下模型类吗?
  • 线性分类器仍然可以(并且可能应该)包含 Softmax。参见例如this Wikipedia article.
  • 这种问题建议你也许应该回到基础,了解你在做什么,而不是仅仅使用它。请考虑一下。
  • 那么,output.data 是否给了我 softmax 向量?如果是,为什么我的概率会高于 1?
  • nn.CrossEntropyLoss 标准假设向其提供了非软最大网络输出。它有效地应用了 softmax,然后是负对数似然损失。将它们结合起来的原因是因为单独的 softmax 在数值上不是很稳定,并且可以以更稳定的方式同时计算这两个操作。如果您想要一个有效的分布,您应该将 softmax 应用于输出,但不应直接将 softmax 应用于您在训练时发送到标准的向量。此外,softmax 保留顺序,因此如果您只对 argmax 感兴趣,则不需要 softmax。

标签: python classification pytorch


【解决方案1】:

您将 logits 作为神经网络的输出。

在输出中使用torch.nn.Softmax 将值压缩到 (0,1) 范围内。

顺便说一句。您的网络应该输出 logits,因为 pytorch 的损失(在这种情况下为 torch.nn.CrossEntropyLoss)旨在与它们一起工作,同时保持数值稳定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-21
    • 2019-11-10
    • 1970-01-01
    • 2021-07-31
    • 2020-11-17
    • 2021-05-08
    • 2018-10-10
    • 1970-01-01
    相关资源
    最近更新 更多