Pytorch 多标签分类Loss

import torch
import numpy as np

pred = np.array([[-0.4089, -1.2471, 0.5907],
                [-0.4897, -0.8267, -0.7349],
                [0.5241, -0.1246, -0.4751]])
label = np.array([[0, 1, 1],
                  [0, 0, 1],
                  [1, 0, 1]])

pred = torch.from_numpy(pred).float()
label = torch.from_numpy(label).float()

## 通过BCEWithLogitsLoss直接计算输入值(pick)
crition1 = torch.nn.BCEWithLogitsLoss()
loss1 = crition1(pred, label)
print(loss1)

crition2 = torch.nn.MultiLabelSoftMarginLoss()
loss2 = crition2(pred, label)
print(loss2)

##  通过BCELoss计算sigmoid处理后的值
crition3 = torch.nn.BCELoss()
loss3 = crition3(torch.sigmoid(pred), label)
print(loss3)

# 三者一致
#tensor(0.7193)
#tensor(0.7193)
#tensor(0.7193)

 

# multilabel_soft_margin_loss 底层代码
def multilabel_soft_margin_loss(input, target, weight=None, size_average=None,
                                reduce=None, reduction='mean'):
    # type: (Tensor, Tensor, Optional[Tensor], Optional[bool], Optional[bool], str) -> Tensor
    r"""multilabel_soft_margin_loss(input, target, weight=None, size_average=None) -> Tensor

    See :class:`~torch.nn.MultiLabelSoftMarginLoss` for details.
    """
    if not torch.jit.is_scripting():
        tens_ops = (input, target)
        if any([type(t) is not Tensor for t in tens_ops]) and has_torch_function(tens_ops):
            return handle_torch_function(
                multilabel_soft_margin_loss, tens_ops, input, target, weight=weight,
                size_average=size_average, reduce=reduce, reduction=reduction)
    if size_average is not None or reduce is not None:
        reduction = _Reduction.legacy_get_string(size_average, reduce)

    loss = -(target * logsigmoid(input) + (1 - target) * logsigmoid(-input))

    if weight is not None:
        loss = loss * weight

    loss = loss.sum(dim=1) / input.size(1)  # only return N loss values

    if reduction == 'none':
        ret = loss
    elif reduction == 'mean':
        ret = loss.mean()
    elif reduction == 'sum':
        ret = loss.sum()
    else:
        ret = input
        raise ValueError(reduction + " is not valid")
    return ret
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

PyTorch是一个流行的开源深度学习框架,它提供了丰富的工具和功能来进行多标签分类任务。多标签分类是指一个样本可以属于多个类别,每个类别之间是相互独立的。 在PyTorch中进行多标签分类,我们可以按照以下步骤进行操作: 1. 数据准备:首先,需要准备好带有标签的训练数据集和验证数据集。每个样本应该有一个对应的输入和一个标签标签是一个二进制向量,其中每个元素表示一个类别,1代表属于该类别,0代表不属于该类别。 2. 构建模型:使用PyTorch的nn模块构建多标签分类模型。可以选择使用现有的预训练模型作为基础模型,也可以自己设计模型。在模型最后一层使用sigmoid激活函数,而不是常用的softmax激活函数,因为sigmoid可以输出独立的概率值而softmax输出的是归一化的概率分布。 3. 定义损失函数和优化器:对于多标签分类任务,常用的损失函数是二分类问题的交叉熵损失,可以使用PyTorch中的BCELoss函数。优化器可以选择常用的Adam或SGD等。 4. 训练模型:按照一般的PyTorch训练流程,将输入样本和标签传入模型,计算损失,进行反向传播和参数更新。 5. 模型评估:通过验证数据集评估模型的性能,可以使用F1 score、accuracy或者precision/recall等指标。可以使用PyTorch中的函数计算这些指标。 以上就是使用PyTorch进行多标签分类的基本步骤。需要注意的是,在数据准备过程中要保证数据类别平衡,训练样本足够丰富,模型设计合理,调整超参数来提高模型性能。多标签分类任务可以应用于很多实际问题,如图像标签分类、文本标签分类等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>