Как охватить список меток в контексте классификации нескольких меток в одно горячее кодирование с помощью pytorch? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть список из одной партии данных с несколькими метками для каждого образца. Так как же превратить его в факел. Тензор в горячем кодировании? Например, с batch_size=5 и class_num=6,

label =[
[1,2,3],
[4,6],
[1],
[1,4,5],
[4]
]

как превратить это в горячее кодирование в pytorch?

label_tensor=tensor([
[1,1,1,0,0,0],
[0,0,0,1,0,1],
[1,0,0,0,0,0],
[1,0,0,1,1,0],
[0,0,0,1,0,0]
])

1 Ответ

0 голосов
/ 23 мая 2019

Если размер пакета может быть получен из len(labels):

def to_onehot(labels, n_categories, dtype=torch.float32):
    batch_size = len(labels)
    one_hot_labels = torch.zeros(size=(batch_size, n_categories), dtype=dtype)
    for i, label in enumerate(labels):
        # Subtract 1 from each LongTensor because your
        # indexing starts at 1 and tensor indexing starts at 0
        label = torch.LongTensor(label) - 1
        one_hot_labels[i] = one_hot_labels[i].scatter_(dim=0, index=label, value=1.)
    return one_hot_labels

, и у вас есть 6 категорий, и вы хотите, чтобы выходной сигнал был тензором целых чисел :

to_onehot(labels, n_categories=6, dtype=torch.int64)
tensor([[1, 1, 1, 0, 0, 0],
        [0, 0, 0, 1, 0, 1],
        [1, 0, 0, 0, 0, 0],
        [1, 0, 0, 1, 1, 0],
        [0, 0, 0, 1, 0, 0]])

Я бы придерживался torch.float32 на тот случай, если вы захотите использовать сглаживание меток, перепутывание или что-то в этом духе позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...