Преобразуйте измерение с горячим кодированием в индекс позиции 1

У меня есть тензор трех измерений [batch_size, sequence_length, number_of_tokens]. Последнее измерение закодировано горячим способом. Я хочу получить тензор двух измерений, где sequence_length состоит из позиции индекса «1» измерения number_of_tokens.

Например, чтобы превратить тензор формы (2, 3, 4):

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

в тензор формы (2, 3), где размер number_of_tokens преобразуется в положение 1:

[[1, 0, 3]
[0, 0, 2]]

Я делаю это, чтобы подготовить результат модели для сравнения с эталонным ответом при вычислении потерь, я надеюсь, что это правильный путь.


person julliet    schedule 05.05.2021    source источник


Ответы (3)


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

t = torch.rand(2, 3, 4)
t = t.argmax(dim=2)
person iacob    schedule 05.05.2021

Просто сделайте:

res = x.argmax(axis = 2)
person swag2198    schedule 05.05.2021

Вы можете делать все, что хотите, через последовательное понимание списка:

x=[[[0, 1, 0, 0],
[1, 0, 0, 0],
[0, 0, 0, 1]],
[[1, 0, 0, 0],
[1, 0, 0, 0],
[0, 0, 1, 0]]]

y=[[ell2.index(1) for ell2 in ell1] for ell1 in x]

print(y) # prints [[1, 0, 3], [0, 0, 2]]

который выполняет итерацию по элементам вашего основного тензора и для каждого элемента возвращает список из 1 индекса в компонентах этого элемента.

person Mostafa Ayaz    schedule 05.05.2021