多标签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
来处理多维张量。在实践中,您可以连接两个任务的两个输出,对目标标签执行相同操作并调用一次标准。
当每个标签应该 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
来处理多维张量。在实践中,您可以连接两个任务的两个输出,对目标标签执行相同操作并调用一次标准。