【问题标题】:torch / lua: retrieving n-best subset from Tensortorch / lua:从张量中检索 n-best 子集
【发布时间】:2018-01-05 23:55:59
【问题描述】:

我现在有以下代码,它将每个问题的最高分索引存储在pred中,并将其转换为字符串。

我想对每个问题的 n 最佳索引执行相同的操作,而不仅仅是具有最高分数的单个索引,并将它们转换为字符串。我还想显示每个索引(或每个转换后的字符串)的分数。

所以scores 必须进行排序,pred 必须是多行/多列而不是 1 x nqs。并且pred 中每个条目对应的score 值必须是可检索的。

我对 lua/torch 语法一无所知,任何帮助将不胜感激。

nqs=dataset['question']:size(1);
scores=torch.Tensor(nqs,noutput);
qids=torch.LongTensor(nqs);
for i=1,nqs,batch_size do
    xlua.progress(i, nqs)
    r=math.min(i+batch_size-1,nqs);
    scores[{{i,r},{}}],qids[{{i,r}}]=forward(i,r);
end

tmp,pred=torch.max(scores,2);

answer=json_file['ix_to_ans'][tostring(pred[{i,1}])]
print(answer)

【问题讨论】:

    标签: lua torch


    【解决方案1】:

    这是我的尝试,我使用一个简单的随机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]
    

    如您所见,valuesi-th 行是scoresi-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]
    

    因此,问题jk-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矩阵中的列索引。

    希望我能很好地解释我的解决方案。

    【讨论】:

      猜你喜欢
      • 2015-09-27
      • 2016-07-05
      • 2016-03-17
      • 2016-10-06
      • 2016-10-27
      • 2016-07-15
      • 2019-04-12
      • 2014-10-04
      • 2017-09-11
      相关资源
      最近更新 更多