【问题标题】:Multi-label classification return more than 1 class in each label多标签分类在每个标签中返回超过 1 个类
【发布时间】:2021-11-21 15:48:16
【问题描述】:

当每个标签应该返回超过 1 个类别时,如何训练多标签分类模型? 例子: 图像分类有 2 个标签:4 类的样式和 5 类的布局。 列表中的图像应返回 2 种样式和 3 种布局,例如 [1 0 1 0] [1 1 0 0 1]

我的样品网:

class MyModel(nn.Module):
def __init__(self, n__classes=32):
    super().__init__()
    self.base_model = models.resnet50(pretrained=True).to(device)
    last_channel = self.base_model.fc.in_features
    self.base_model.fc = nn.Sequential()
    
    self.layout = nn.Sequential(
        nn.Dropout(0.2),
        nn.Linear(last_channel, n_classes_layout),
        nn.Sigmoid()
    )
    self.style = nn.Sequential(
        nn.Dropout(0.2),
        nn.Linear(last_channel, n_classes_style),
        nn.Sigmoid()
    )
def forward(self, x):
    base = self.base_model(x)
    return self.layout(base), self.style(base)

def loss_fn(outputs, targets):
    o1, o2 = outputs
    t1, t2 = targets

【问题讨论】:

  • 这是多标签分类的定义,与多类不同,样本只能属于一个类。我建议您先做一些研究 - 这个问题对于 SO 来说太模糊和太宽泛了。

标签: deep-learning pytorch image-classification


【解决方案1】:

我不确定您所指的标签是什么,但您似乎有一个多输出模型一方面预测 style,另一方面预测 layout。因此,我假设您正在处理具有两个“独立”输出的多任务网络,这些输出分别使用两个损失项进行监督。

考虑这两个之一:您可以将此多标签分类任务视为输出n 值,每个值估计相应标签出现在输入中的概率。在您的第一个任务中,您有四个班级,在第二个任务中,您有五个班级。

与单标签分类任务不同,在这里您希望每个标签输出一个激活:您可以使用每个 logit 的 sigmoid 激活。然后对每个输出应用二元交叉熵损失。在 PyTorch 中,您可以使用 BCELoss,它处理多维张量。在实践中,您可以连接两个任务的两个输出,对目标标签执行相同操作并调用标准一次。

【讨论】:

  • 我的意思是,我尝试了多输出模型以使用 sigmoid 函数在每个标签中返回 1 个类。输出数组通常有 1 个 '1' 和 orthers 是 '0',如 [1 0 0 0]。那么,我可以训练该模型以获得更多“1”的输出,例如 [1 0 0 1]?
  • 你使用的是哪个损失函数?
  • 不,我只是想问这可能吗?如果可能的话,我可以自己训练模型。
  • 尝试粘贴你的预测代码
  • 我觉得不错,你应该把self.base_model.fc = nn.Sequential()换成self.base_model.fc = nn.Identity()
猜你喜欢
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 2017-03-20
  • 2017-09-18
  • 2019-04-01
  • 2013-12-03
相关资源
最近更新 更多