将BCE损耗与ResNet输出一起使用的适当方法是什么?



标题解释了整体问题,但为了一些详细说明:

我正在使用torchvision.models.resnet18()来运行异常检测方案。我通过以下方式初始化模型:

net = torchvision.models.resnet18(num_classes=2)

因为在我的特定设置中,0等于正常样本,1等于异常样本。

我的模型的输出形状为(16, 2)(批量大小为 16(,标签的大小为(16, 1)。这给了我两个输入张量形状不合适的错误。

为了解决这个问题,我尝试了这样的事情:

>>> new_output = torch.argmax(output, dim=1)

这给了我合适的形状,但运行loss = nn.BCELoss(new_output, labels)给了我错误:

RuntimeError: bool value of Tensor with more than one value is ambiguous

我处理此问题的适当方法是什么?谢谢。

编辑

我也尝试使用nn.CrossEntropyLoss,但得到相同的运行时错误。

更具体地说,我尝试了nn.CrossEntropyLoss(output, label)nn.CrossEntropyLoss(output, label.flatten()).

如果要使用 BCELoss,即使有两个类,输出形状也应(16, 1)而不是(16, 2)。您可以考虑阅读这篇出色的文章,以在二进制交叉熵损失下。

由于您是从带有形状(16, 2)resnet18获得输出的,因此您应该使用CrossEntropyLoss,您可以在其中给出形状(16)的输出和标签(16, 2)

应按如下方式使用CrossEntropyLoss

loss_crit = nn.CrossEntropyLoss()
loss = loss_crit(output, label) 

其中输出 =(16, 2)和标签 =(16)。请注意,标签应包含 0 或 1。

请参阅官方文档中提供的示例(复制如下(。

>>> loss = nn.CrossEntropyLoss()
>>> input = torch.randn(3, 5, requires_grad=True)
>>> target = torch.empty(3, dtype=torch.long).random_(5)
>>> output = loss(input, target)
>>> output.backward()

相关内容

最新更新