多标签class化return每个标签多于1个class

Multi-label classification return more than 1 class in each label

当每个标签应该 return 多于 1 class 时,如何训练多标签 class化模型? 例子: 图片 classification 有 2 个标签:4 个 class 样式和 5 个 class 布局。 列表中的图像应该 return 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

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

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

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