Pytorch 将BCE损耗用于ResNet输出的适当方式是什么?

Pytorch 将BCE损耗用于ResNet输出的适当方式是什么?,pytorch,Pytorch,标题解释了整个问题,但有些细节: 我正在使用torchvision.models.resnet18()运行异常检测方案。我通过执行以下操作初始化模型: net = torchvision.models.resnet18(num_classes=2) 因为在我的特定设置中,0等于正常样本,1等于异常样本 我的模型输出的形状为(16,2)(批量大小为16),标签的大小为(16,1)。这给了我两个输入张量形状不合适的错误 为了解决这个问题,我尝试了以下方法: >>> new_out

标题解释了整个问题,但有些细节:

我正在使用
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(新的\u输出,标签)
会给我错误:

RuntimeError: bool value of Tensor with more than one value is ambiguous
我处理这个问题的适当方式是什么?谢谢

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


更具体地说,我尝试了
nn.CrossEntropyLoss(output,label)
nn.CrossEntropyLoss(output,label.flatte())
如果要使用BCELoss,输出形状应该是
(16,1)
而不是
(16,2)
。你可以考虑阅读这个优秀的下二元交叉熵损失。< /P> 由于您使用shape
(16,2)
,从
resnet18
获取输出,因此您应该在可以提供
(16,2)
输出和shape
(16)
标签的位置使用

您应该使用
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()

嗨,谢谢你的回答!我也尝试过使用交叉熵损失,但是在
bool
值不明确的情况下,我得到了相同的运行时错误。我将把它编辑到问题中。如果您使用的是CrossEntropyLoss,请不要执行
argmax
。谢谢!使用
nn.CrossEntropyLoss(输出,labels.flatte())
运行正常:您应该使用
nn.CrossEntropyLoss()(输出,标签)