我正在尝试修改 Yolo v1 以处理我的任务,其中每个对象只有 1 个类。 (例如:一个对象不能同时是猫和狗)
由于架构的原因(诸如本地化预测之类的其他输出必须使用回归),因此 sigmoid 被应用于模型的最后一个输出(f.sigmoid(nearly_last_output))。而对于分类,yolo 1 也使用 MSE 作为损失。但据我所知,与我想要的 one-hot 的交叉熵相比,MSE 有时表现不佳。
具体的:GT是这样的:0 0 0 0 1
(假设我们总共只有5个类,每个类只有1个类,所以其中只有一个数字1,当然这是本例中为第 5 类)
分类部分的输出模型:0.1 0.1 0.9 0.2 0.1
我发现一些建议使用 nn.BCE
/nn.BCEWithLogitsLoss
但我认为我应该在这里要求更正确的信息,因为我不擅长数学,也许我有些地方错了,所以只是要求了解更多信息,并确定我应该正确使用什么?
最佳答案
MSE
损失通常用于回归问题。对于二元分类,您可以使用
BCE
或BCEWithLogitsLoss
。BCEWithLogitsLoss
将 sigmoid 和 BCE loss 结合起来,因此如果最后一层应用了 sigmoid,则可以直接使用BCE
。您的案例中提到的 GT 指的是“多类”分类问题,并且显示的输出并不真正对应于
多类
分类。因此,在这种情况下,您可以应用CrossEntropyLoss
,它结合了 softmax 和对数损失,适合“多类”分类问题。
关于python - 在 Pytorch 上使用 sigmoid 输出进行交叉熵损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63914849/