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



我目前正在进行我的迷你项目,根据海报预测电影类型。因此,在我拥有的数据集中,每部电影可以有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种。因此,在我看来,我应该找到我的输出列表的3个最大值,2个最大值或1个最大值。这是15种流派的列表,例如,如果

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

some_kind_of_function(输出(应该给我的输出

[1 0 0 0 0 1 0 0],

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

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

提前感谢您,感谢任何帮助或建议:(

  1. 你是对的,你希望对每个海报类型对进行二元分类(海报X是否是戏剧电影?它是否是动作电影?(。BinaryCrossEntropy(WithLogits)是我们要走的路
  2. 关于评估结果算法的最佳指标,由您决定,您在寻找什么。但你可能想研究一下精确性和召回率或f1分数之类的想法就我个人而言,我可能会为每种类型选择前三名(因为这是每个海报分配的最大类型数量(,看看预期的类型是否会以高概率出现,以及意外的类型(如果是一部有两种"基本真相"类型的电影(是否会出现在最后一位,分配的概率要小得多

相关内容

  • 没有找到相关文章

最新更新