Python 标签不平衡的多标签分类

Python 标签不平衡的多标签分类,python,tensorflow,neural-network,pytorch,multilabel-classification,Python,Tensorflow,Neural Network,Pytorch,Multilabel Classification,我正在建立多标签分类网络。 我的GT是长度512[0,0,0,1,0,1,0,…,0,0,0,1] 大多数情况下,它们是零,每个向量大约有5个1,其余为零 我想做: 使用sigmoid激活输出层 对损失函数使用二进制交叉熵 但我怎样才能解决不平衡的问题呢? 网络可以学习预测始终为零,并且仍然具有很低的学习损失分数 我如何才能让它真正学会预测……你不能轻易地增加样本,因为这是一个多标签的案例(我从帖子中错过了这一点) 你能做的就是给1更高的权重,比如: import torch class B

我正在建立多标签分类网络。 我的GT是长度
512
[0,0,0,1,0,1,0,…,0,0,0,1]
大多数情况下,它们是
,每个向量大约有
5个1
,其余为零

我想做:

使用
sigmoid
激活输出层

对损失函数使用二进制交叉熵

但我怎样才能解决不平衡的问题呢? 网络可以学习预测
始终为零
,并且仍然具有很低的学习损失分数


我如何才能让它真正学会预测……你不能轻易地增加样本,因为这是一个多标签的案例(我从帖子中错过了这一点)

你能做的就是给
1
更高的权重,比如:

import torch


class BCEWithLogitsLossWeighted(torch.nn.Module):
    def __init__(self, weight, *args, **kwargs):
        super().__init__()
        # Notice none reduction
        self.bce = torch.nn.BCEWithLogitsLoss(*args, **kwargs, reduction="none")
        self.weight = weight

    def forward(self, logits, labels):
        loss = self.bce(logits, labels)
        binary_labels = labels.bool()
        loss[binary_labels] *= labels[binary_labels] * self.weight
        # Or any other reduction
        return torch.mean(loss)


loss = BCEWithLogitsLossWeighted(50)
logits = torch.randn(64, 512)
labels = torch.randint(0, 2, size=(64, 512)).float()

print(loss(logits, labels))
您还可以使用来关注积极的示例(在某些库中应该有一些可用的实现)

编辑:

焦点损失也可以按照这些线编码(功能形式,因为这是我在回购协议中所做的,但你应该能够从中工作):


你不能轻易地增加样本,因为这是一个多标签的案例(我在文章中错过了这一点)

你能做的就是给
1
更高的权重,比如:

import torch


class BCEWithLogitsLossWeighted(torch.nn.Module):
    def __init__(self, weight, *args, **kwargs):
        super().__init__()
        # Notice none reduction
        self.bce = torch.nn.BCEWithLogitsLoss(*args, **kwargs, reduction="none")
        self.weight = weight

    def forward(self, logits, labels):
        loss = self.bce(logits, labels)
        binary_labels = labels.bool()
        loss[binary_labels] *= labels[binary_labels] * self.weight
        # Or any other reduction
        return torch.mean(loss)


loss = BCEWithLogitsLossWeighted(50)
logits = torch.randn(64, 512)
labels = torch.randint(0, 2, size=(64, 512)).float()

print(loss(logits, labels))
您还可以使用来关注积极的示例(在某些库中应该有一些可用的实现)

编辑:

焦点损失也可以按照这些线编码(功能形式,因为这是我在回购协议中所做的,但你应该能够从中工作):


@伊万,这是一个完全不同的问题。@伊万,这是一个完全不同的问题。