pytorch - pytorch中的多标签分类

标签 pytorch

我有一个多标签分类问题。我有 11 个类,大约 4k 个示例。每个示例可以有 1 到 4-5 个标签。目前,我正在使用 log_loss 为每个类分别训练一个分类器。正如您所料,训练 11 个分类器需要相当长的时间,我想尝试另一种方法并只训练 1 个分类器。这个想法是这个分类器的最后一层将有 11 个节点,并且会按类输出一个实数,然后通过 sigmoid 将其转换为概率。我要优化的损失是所有类的 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

关于pytorch - pytorch中的多标签分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52855843/

相关文章:

python - Pytorch DataLoader内存未释放

python - 类型错误 : forward() takes 2 positional arguments but 3 were given in pytorch

machine-learning - Batchnorm2d Pytorch - 为什么将 channel 数传递给 batchnorm?

Pytorch 从最后一个张量维度中选择值,其索引来自另一个维度较小的 Tenor

python - 在 Pytorch 中实现 LeNet

python - 给定一个表示段边界的值,为张量生成段标签

python - Pytorch和多项式线性回归问题

python - 添加批量归一化会降低性能

pytorch - 如何同时将多个张量移动到 Cuda 设备?

deep-learning - 如何在pytorch中连接嵌入层