PyTorch 分类器输出啥?

Posted

技术标签:

【中文标题】PyTorch 分类器输出啥?【英文标题】:What does PyTorch classifier output?PyTorch 分类器输出什么? 【发布时间】:2021-01-16 01:56:40 【问题描述】:

所以我是深度学习的新手,开始学习 PyTorch。我创建了一个具有以下结构的分类器模型。

class model(nn.Module):
def __init__(self):
    super(model, self).__init__()
    resnet = models.resnet34(pretrained=True)
    layers = list(resnet.children())[:8]
    self.features1 = nn.Sequential(*layers[:6])
    self.features2 = nn.Sequential(*layers[6:])
    self.classifier = nn.Sequential(nn.BatchNorm1d(512), nn.Linear(512, 3))
    
def forward(self, x):
    x = self.features1(x)
    x = self.features2(x)
    x = F.relu(x)
    x = nn.AdaptiveAvgPool2d((1,1))(x)
    x = x.view(x.shape[0], -1)
    return self.classifier(x)

所以基本上我想在 0,1,2 三个方面进行分类。在评估时,我传递了图像,它返回了一个具有如下三个值的张量

    (tensor([[-0.1526,  1.3511, -1.0384]], device='cuda:0', grad_fn=<AddmmBackward>)

所以我的问题是这三个数字是什么?它们是概率吗?

附:如果我问的太傻了,请原谅我。

【问题讨论】:

【参考方案1】:

因此,在训练之后,您想要做的是将softmax 应用于输出张量以提取每个类的概率,然后选择最大值(最高概率)。

在你的情况下:

prob = torch.nn.functional.softmax(model(x), dim=1)
_, pred_class = torch.max(prob, dim=1)

【讨论】:

原始值?它们代表对数概率【参考方案2】:

你的模型的self.classifier的最后一层nn.Linear(全连接层)产生值,我们可以称之为scores,例如,它可能是:[10.3, -3.5, -12.0],您也可以在示例中看到相同的内容:[-0.1526, 1.3511, -1.0384] 未标准化,不能解释为概率。

正如您所看到的,它只是一种“原始未缩放”的网络输出,换句话说,这些值没有归一化,很难使用它们或解释结果,这就是为什么通常的做法是将它们转换为归一化概率的原因正如@skinny_func 已经描述的那样,在最后一层之后使用softmax 进行分发。之后你会得到0到1范围内的概率,更直观的表示。

【讨论】:

以上是关于PyTorch 分类器输出啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何用Pytorch实现一个分类器?

掌握如何用Pytorch实现一个分类器

决策树分类器 sklearn 中节点的不同颜色表示啥?

Pytorch应用:构建分类器

Pytorch学习01-训练图像分类器

使用 PyTorch 的多标签、多类图像分类器 (ConvNet)