我想在 PyTorch 中实现一个多热向量。
以下代码简洁地演示了所需的行为:
max_num = 4
multi_hot_num = 3
x = torch.tensor([0, 2, 1])
期望输出:
tensor([[1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 ,0, 0]])
我尝试找到一种没有循环的优化方法,但似乎使用循环是唯一的解决方案(据我所知)。
import torch
max_num = 4
multi_hot_num = 3
x = torch.tensor([0, 2, 1])
assert torch.all(x < max_num)
result = torch.zeros(len(x), max_num*multi_hot_num)
for i, (start, end) in enumerate(zip(x*multi_hot_num, (x+1)*multi_hot_num)):
result[i, start:end] = 1.
print(result)
结果:
tensor([[1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 1., 1., 1., 0., 0., 0.],
[0., 0., 0., 1., 1., 1., 0., 0., 0., 0., 0., 0.]])