多 class classifcation 与 Pytorch
Multi class classifcation with Pytorch
我是 Pytorch 的新手,我需要澄清多类分类。
我正在微调 DenseNet 神经网络,因此它可以识别 3 种不同的 类。
因为是multiclass问题,所以我要这样替换分类层:
kernelCount = self.densenet121.classifier.in_features
self.densenet121.classifier = nn.Sequential(nn.Linear(kernelCount, 3), nn.Softmax(dim=1))
并使用CrossEntropyLoss作为损失函数:
loss = torch.nn.CrossEntropyLoss(reduction='mean')
通过阅读Pytorch 论坛,我发现CrossEntropyLoss 在神经网络的输出上应用了softmax 函数。这是真的?我应该从网络结构中删除 Softmax 激活函数吗?
那么测试阶段呢?如果包含,我必须在模型的输出上调用 softmax 函数?
在此先感谢您的帮助。
是的,CrossEntropyLoss
隐式应用 softmax。您应该删除网络末端的 softmax 层,因为 softmax 不是 幂等的,因此应用它两次将是语义错误。
就evaluation/testing而言。请记住,softmax 是一个单调递增的操作(这意味着输出的相对顺序在您应用它时不会改变)。因此 argmax 在 softmax 之前和之后的结果将给出相同的结果。
你唯一可能想要在评估期间明确执行 softmax 的情况是,如果你出于某种原因需要实际的置信度值。如果需要,您可以在评估期间使用 torch.softmax
在网络输出上显式应用 softmax。
我是 Pytorch 的新手,我需要澄清多类分类。
我正在微调 DenseNet 神经网络,因此它可以识别 3 种不同的 类。
因为是multiclass问题,所以我要这样替换分类层:
kernelCount = self.densenet121.classifier.in_features
self.densenet121.classifier = nn.Sequential(nn.Linear(kernelCount, 3), nn.Softmax(dim=1))
并使用CrossEntropyLoss作为损失函数:
loss = torch.nn.CrossEntropyLoss(reduction='mean')
通过阅读Pytorch 论坛,我发现CrossEntropyLoss 在神经网络的输出上应用了softmax 函数。这是真的?我应该从网络结构中删除 Softmax 激活函数吗?
那么测试阶段呢?如果包含,我必须在模型的输出上调用 softmax 函数?
在此先感谢您的帮助。
是的,CrossEntropyLoss
隐式应用 softmax。您应该删除网络末端的 softmax 层,因为 softmax 不是 幂等的,因此应用它两次将是语义错误。
就evaluation/testing而言。请记住,softmax 是一个单调递增的操作(这意味着输出的相对顺序在您应用它时不会改变)。因此 argmax 在 softmax 之前和之后的结果将给出相同的结果。
你唯一可能想要在评估期间明确执行 softmax 的情况是,如果你出于某种原因需要实际的置信度值。如果需要,您可以在评估期间使用 torch.softmax
在网络输出上显式应用 softmax。