这是我的尝试,我使用一个简单的随机scores 张量来演示它的行为:
> scores=torch.floor(torch.rand(4,10)*100)
> =scores
9 1 90 12 62 1 62 86 46 27
7 4 7 4 71 99 33 48 98 63
82 5 73 84 61 92 81 99 65 9
33 93 64 77 36 68 89 44 19 25
[torch.DoubleTensor of size 4x10]
现在,既然您想要每个问题(行)的 N 最佳索引,让我们对张量的每一行进行排序:
> values,indexes=scores:sort(2)
现在,让我们看看返回张量包含什么:
> =values
1 1 9 12 27 46 62 62 86 90
4 4 7 7 33 48 63 71 98 99
5 9 61 65 73 81 82 84 92 99
19 25 33 36 44 64 68 77 89 93
[torch.DoubleTensor of size 4x10]
> =indexes
2 6 1 4 10 9 5 7 8 3
2 4 1 3 7 8 10 5 9 6
2 10 5 9 3 7 1 4 6 8
9 10 1 5 8 3 6 4 7 2
[torch.LongTensor of size 4x10]
如您所见,values 的i-th 行是scores 的i-th 行的排序版本(按升序排列),indexes 中的每一行都为您提供相应的索引。
您可以通过
获得每个问题(
即行)的
N最佳值/索引
> N_best_indexes=indexes[{{},{indexes:size(2)-N+1,indexes:size(2)}}]
> N_best_values=values[{{},{values:size(2)-N+1,values:size(2)}}]
让我们看看它们在给定示例中的值,N=3:
> return N_best_indexes
7 8 3
5 9 6
4 6 8
4 7 2
[torch.LongTensor of size 4x3]
> return N_best_values
62 86 90
71 98 99
84 92 99
77 89 93
[torch.DoubleTensor of size 4x3]
因此,问题j 的k-th 最佳值是N_best_values[{{j},{values:size(2)-k+1}]],它在scores 矩阵中的对应索引由这个row, column 值给出:
row=j
column=N_best_indexes[{{j},indexes:size(2)-k+1}}].
例如,第二个问题的第一个最佳值 (k=1) 是99,它位于scores 中的2nd 行和6th 列。你可以看到values[{{2},values:size(2)}}]是99,而indexes[{{2},{indexes:size(2)}}]给你6,这是scores矩阵中的列索引。
希望我能很好地解释我的解决方案。