我有一个多标签分类问题。我有11个课程,大约4k个示例。每个示例可以具有1到4-5的标签。目前,我正在为每个类别分别使用log_loss训练分类器。如您所料,训练11个分类器需要花费很多时间,我想尝试另一种方法,只训练1个分类器。这个想法是,该分类器的最后一层将有11个节点,并将按类输出实数,然后将其通过S型转换为Proba。我要优化的损失是所有类上log_loss的平均值。
不幸的是,我是pytorch的菜鸟,即使通过阅读损失的源代码,我也无法弄清楚是否已经存在的损失之一确实满足我的要求,或者我是否应该创造新的损失,如果是这样,我真的不知道该怎么做。
具体来说,我想为批次中的每个元素提供一个大小为11的向量(其中每个标签均包含一个实数(越接近无穷大,则该类别的预测值越接近1),以及1的向量大小为11(每个真实标签均包含1),并能够计算所有11个标签的均值log_loss,并基于该损失优化分类器。
任何帮助将不胜感激 :)
您正在寻找torch.nn.BCELoss
。这是示例代码:
import torch
batch_size = 2
num_classes = 11
loss_fn = torch.nn.BCELoss()
outputs_before_sigmoid = torch.randn(batch_size, num_classes)
sigmoid_outputs = torch.sigmoid(outputs_before_sigmoid)
target_classes = torch.randint(0, 2, (batch_size, num_classes)) # randints in [0, 2).
loss = loss_fn(sigmoid_outputs, target_classes)
# alternatively, use BCE with logits, on outputs before sigmoid.
loss_fn_2 = torch.nn.BCEWithLogitsLoss()
loss2 = loss_fn_2(outputs_before_sigmoid, target_classes)
assert loss == loss2
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10687 次 |
最近记录: |