如何在pytorch中的MultiClass分类模型中预测标签?

时间:2018-12-15 01:30:47

标签: conv-neural-network pytorch multilabel-classification multiclass-classification

我目前正在我的小型项目中,我会根据他们的海报预测电影类型。因此,在我拥有的数据集中,每部电影可以具有1到3种类型,因此每个实例可以属于多个类别。我总共有15个课程(15个流派)。因此,现在我面临的问题是如何使用pytorch对这个特定问题进行预测。

在pytorch CIFAR教程中,每个实例只能具有一个类别(例如,如果图像是汽车,则它应属于汽车类别),并且总共有10个类别。因此,在这种情况下,模型预测是通过以下方式定义的(从pytorch网站复制代码段):

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

for epoch in range(2):  # loop over the dataset multiple times

running_loss = 0.0
for i, data in enumerate(trainloader, 0):
    # get the inputs
    inputs, labels = data

    # zero the parameter gradients
    optimizer.zero_grad()

    # forward + backward + optimize
    outputs = net(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()

    # print statistics
    running_loss += loss.item()
    if i % 2000 == 1999:    # print every 2000 mini-batches
        print('[%d, %5d] loss: %.3f' %
              (epoch + 1, i + 1, running_loss / 2000))
        running_loss = 0.0

打印(“完成培训”)

问题1(用于培训部分)。您建议使用什么作为激活功能。我当时在考虑BCEWithLogitsLoss(),但不确定其效果如何。

,然后通过以下方式定义测试集预测的准确性: 对于整个网络:

correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' % (
    100 * correct / total))

以及每个课程:

class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs, 1)
        c = (predicted == labels).squeeze()
        for i in range(4):
            label = labels[i]
            class_correct[label] += c[i].item()
            class_total[label] += 1


for i in range(10):
    print('Accuracy of %5s : %2d %%' % (
        classes[i], 100 * class_correct[i] / class_total[i]))

其中的输出如下:

Accuracy of plane : 36 % 
Accuracy of   car : 40 % 
Accuracy of  bird : 30 % 
Accuracy of   cat : 19 % 
Accuracy of  deer : 28 % 
Accuracy of   dog : 17 % 
Accuracy of  frog : 34 % 
Accuracy of horse : 43 % 
Accuracy of  ship : 57 % 
Accuracy of truck : 35 % 

现在是问题2: 我该如何确定精度,以便通过以下方式查看:

例如:

The Matrix (1999)                ['Action: 91%', 'Drama: 25%', 'Adventure: 13%']
The Others (2001)                ['Drama: 76%', 'Horror: 65%', 'Action: 41%']
Alien: Resurrection (1997)       ['Horror: 67%', 'Action: 64%', 'Drama: 43%']
The Martian (2015)               ['Drama: 95%', 'Adventure: 81%']

考虑到每部电影并不总是具有3种类型,有时是2种,有时是1种。所以,就我所见,我应该在输出列表(即list)中找到3个最大值,2个最大值或1个最大值。 15种类型,例如

我预计的类型是[电影,冒险],然后

some_kind_of_function(outputs)应该给我输出

[1 0 0 0 0 0 0 0 0 0 0 1 0 0 0],

之后我可以将其与ground_truth进行比较。  我认为torchmax在这种情况下不起作用,因为它只提供[weigts array]的一个最大值,所以

实现它的最佳方法是什么?

在此先感谢您,感谢您的帮助或建议:)

1 个答案:

答案 0 :(得分:1)

  1. 是的,您要对每个海报类型进行二进制分类(海报X是否是戏剧电影?是否是动作电影?)。 BinaryCrossEntropy(WithLogits)是必经之路。
  2. 关于评估最终算法的最佳指标,在寻找什么取决于您。但是您可能想研究诸如precision and recallf1 score之类的想法。 个人,我可能会为每种类型选择前3名(因为这是分配给每个海报的最大类型),然后查看预期出现的可能性是否很高,是否出现意外的情况? (如果电影具有两种“地面实况”类型),则放映在最后的位置,分配的概率要少得多。