标题解释了整体问题,但为了一些详细说明:
我正在使用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()