Pytorch: Как найти точность для классификации по нескольким меткам? - PullRequest
0 голосов
/ 30 апреля 2020

Я использую vgg16, где количество классов равно 3, и для точки данных можно прогнозировать несколько меток.

vgg16 = models.vgg16(pretrained=True) vgg16.classifier[6]= nn.Linear(4096, 3)

с использованием функции потерь: nn.BCEWithLogitsLoss()

Я могу найти точность поиска в случае проблемы с одной меткой, как

 `images, labels = data
 images, labels = images.to(device), labels.to(device)
 labels = Encode(labels)
 outputs = vgg16(images)
 _, predicted = torch.max(outputs.data, 1)
 total += labels.size(0)
 correct += (predicted == labels).sum().item()
 acc = (100 * correct / total)`

Как найти точность для классификации по нескольким меткам?

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

Если вы рассматриваете точность в терминах общего количества исправленных меток , то вам также следует присвоить 0 для выходов, меньших порогового значения, в отличие от принятого ответа.

См. Следующий код:

labels = Encode(labels) ## for example, labels = [[1,0,1],[0,1,1]]
N,C = labels.shape

outputs = vgg16(images)
outputs = torch.sigmoid(outputs) ## for example, outputs = [[0.75,0.4,0.9],[0.2,0.6,0.8]]

## for threshold of 0.5 accuracy should be 100% while from accepted answer you will get 66.67% so

outputs[outputs >= 0.5] = 1
outputs[outputs < 0.5] = 0 ## assign 0 label to those with less than 0.5

accuracy = (outputs == labels).sum() / (N*C) * 100
1 голос
/ 30 апреля 2020

На ваш вопрос vgg16 возвращает необработанные логиты. Итак, вот что вы можете сделать:

labels = Encode(labels)  # torch.Size([N, C]) e.g. tensor([[1., 1., 1.]])
outputs = vgg16(images)  # torch.Size([N, C])
outputs = torch.sigmoid(outputs)  # torch.Size([N, C]) e.g. tensor([[0., 0.5, 0.]])
outputs[outputs >= 0.5] = 1
accuracy = (outputs == labels).sum()/(N*C)*100
...