PyTorch 分类器输出什么?
What does PyTorch classifier output?
所以我是深度学习新手,开始学习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>)
所以我的问题是这三个数字是多少?它们是概率吗?
P.S。请原谅我问的太傻了
所以在训练之后你想要做的是将 softmax
应用于输出张量以提取每个 class 的概率,然后你选择最大值(最高概率)。
你的情况:
prob = torch.nn.functional.softmax(model(x), dim=1)
_, pred_class = torch.max(prob, dim=1)
模型 self.classifier
的最后一层 nn.Linear
(全连接层)产生值,我们可以称之为 scores,例如,它可能是:[10.3, -3.5, -12.0]
,与您在示例中看到的相同:[-0.1526, 1.3511, -1.0384]
未标准化,不能解释为概率。
如您所见,它只是一种“原始未缩放”的网络输出,换句话说,这些值未标准化,很难使用它们或解释结果,这就是为什么通常的做法是将它们转换为在最后一层之后使用 softmax
归一化概率分布,正如@skinny_func 已经描述的那样。之后会得到0和1范围内的概率,比较直观的表示。
所以我是深度学习新手,开始学习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>)
所以我的问题是这三个数字是多少?它们是概率吗?
P.S。请原谅我问的太傻了
所以在训练之后你想要做的是将 softmax
应用于输出张量以提取每个 class 的概率,然后你选择最大值(最高概率)。
你的情况:
prob = torch.nn.functional.softmax(model(x), dim=1)
_, pred_class = torch.max(prob, dim=1)
模型 self.classifier
的最后一层 nn.Linear
(全连接层)产生值,我们可以称之为 scores,例如,它可能是:[10.3, -3.5, -12.0]
,与您在示例中看到的相同:[-0.1526, 1.3511, -1.0384]
未标准化,不能解释为概率。
如您所见,它只是一种“原始未缩放”的网络输出,换句话说,这些值未标准化,很难使用它们或解释结果,这就是为什么通常的做法是将它们转换为在最后一层之后使用 softmax
归一化概率分布,正如@skinny_func 已经描述的那样。之后会得到0和1范围内的概率,比较直观的表示。