无法在pytorch python中使用多目标损失函数

Posted

技术标签:

【中文标题】无法在pytorch python中使用多目标损失函数【英文标题】:Unable to use multi target loss function in pytorch python 【发布时间】:2021-11-17 19:57:43 【问题描述】:

我无法在 pytorch 中使用损失函数进行多标签分类 这是我的损失函数:

 def loss(self,pred,y_true):
    pred = torch.tensor(pred)
    y_true = torch.tensor(y_true)
    loss = nn.NLLLoss()(torch.log(pred), y_true)   
    return loss

关于尝试失去:

model.loss(model(xtrain),ytrain)

显示错误:

RuntimeError: 1D target tensor expected, multi-target not supported

我也用 cross_entropy 试过了:

F.cross_entropy 

但是这个错误仍然出现,pytorch 中是否存在用于 multi_label 分类的内置损失

【问题讨论】:

【参考方案1】:

我不相信有一个内置函数可以计算多标签分类交叉熵。 F.nll_lossF.cross_entropy 仅用于单标签任务(这就是它需要密集标签的原因)。但是,您可以自己实现它。

如果pred 包含您的输出对数,那么您需要提取概率分布并应用负对数似然。这是 softmax 交叉熵损失

>>> -torch.sum(F.log_softmax(pred, dim=1) * labels, dim=1)

如果每个输出组件彼此独立,则在 logits 上应用 sigmoid,并将每个组件视为具有负对数似然的 0/1 分类任务。这是 sigmoid 交叉熵损失:

>>> act = torch.sigmoid(pred)
>>> y_true*-torch.log(act) + (1-y_true)*-torch.log(1-act)

【讨论】:

以上是关于无法在pytorch python中使用多目标损失函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将交叉熵损失用于多标签?

pytorch 错误:CrossEntropyLoss() 中不支持多目标

pytorch中序数多分类的损失函数

忽略 keras 中 R 的缺失目标值的损失函数

学习笔记Pytorch十二损失函数与反向传播

Pytorch 语义分割损失函数