为什么torchvision.models.resnet18不使用softmax?

机器算法验证 神经网络 分类 图像处理 软最大 火炬
2022-03-25 05:26:04

我看到来自 torchvision 包的图像分类模型没有 softmax 层作为最终层。例如,以下代码段很容易显示 resnet18 输出的 sum = 1,因此肯定不存在 softmax 层。

from torchvision import models
import torch

model = models.resnet18(pretrained=False)

x = torch.rand(8,3,200,200)

y = model(x) 

print(y.sum(dim=1))

那么,问题来了,为什么pytorch vision最后没有放一个softmax层呢?放置一个softmax层可以提高多少性能?为什么?

1个回答

在 PyTorch 中是否需要 softmax 层来训练神经网络取决于您使用的损失函数。如果您使用torch.nn.CrossEntropyLoss,则 softmax 被计算为损失的一部分。从链接:

损失可以描述为:

loss(x,class)=log(exp(x[class])jexp(x[j]))

这种损失只是 a 和损失的torch.nn.LogSoftmax串联torch.nn.NLLLoss从以下文档torch.nn.CrossEntropyLoss

该标准将LogSoftmax和结合NLLLoss在一个类中。

并来自以下文档torch.nn.NLLLoss

通过在网络的最后一层添加LogSoftmax层,可以轻松获得神经网络中的对数概率。如果您不想添加额外的层,您可以改用CrossEntropyLoss 。

这些预训练模型的开发人员似乎torch.nn.CrossEntropyLoss在创建它们时就已经考虑到了。