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()(输出,标签)
。