【问题标题】:Structure tensor based off index基于索引的结构张量
【发布时间】:2019-05-14 15:17:02
【问题描述】:

我正在尝试根据相应的索引张量加入多个张量。作为一个玩具示例,我有一个张量 A = [[0,1,2],[2,3,4]] 和对应的索引向量 B = [0,1] 和另一个张量 C = [[5,6,7],[8,9,10],[11,12,13]] 和对应的索引向量 D = [0,1,2]。我试图返回一个张量,使得E = [[0,1,2],[5,6,7],[2,3,4],[8,9,10],[11,12,13]] 具有相同索引的值组合在一起。我正在尝试有效地执行此操作,因为它包含在我的 NN 模型中,并且在反向传播期间可能会遇到性能问题。

我能够通过构建字典和 for 循环来实现这一点:

E = defaultdict(list)
for vector, indices in zip([A,C],[B,D]):
    for vector, i in enumerate(vector):
        E[indices[i]].append(vector)
E = list(E.values())

但是,这种方法会显着减慢模型训练的速度。有没有办法更有效地做到这一点? Pytorch 的各种 index_ 操作似乎并没有解决这个问题。谢谢!

【问题讨论】:

    标签: python machine-learning pytorch


    【解决方案1】:

    我假设 AC 张量的行数不同,但列数相同。

    A = torch.LongTensor([[0,1,2],[2,3,4]]) # torch.Size([2, 3])
    C = torch.LongTensor([[5,6,7],[8,9,10],[11,12,13]]) # torch.Size([3, 3])
    
    assert A.dim() == C.dim() == 2
    assert A.size(1) == C.size(1)
    
    shape_E = (A.size(0) + C.size(0), A.size(1))
    E = torch.zeros(*shape_E).long()
    
    # Two possible cases
    if A.size(0) > C.size(0): # C has fewer rows
        n_rows = C.size(0)
        E[np.arange(0, 2*n_rows, 2), :] = A[:n_rows, :]
        E[np.arange(1, 2*n_rows, 2), :] = C[:n_rows, :]
        E[2*n_rows:, :] = A[n_rows:, :]
    else: # A has fewer rows
        n_rows = A.size(0)
        E[np.arange(0, 2*n_rows, 2), :] = A[:n_rows, :]
        E[np.arange(1, 2*n_rows, 2), :] = C[:n_rows, :]
        E[2*n_rows:, :] = C[n_rows:, :]
    
    print(E)
    

    输出

    tensor([[ 0,  1,  2],
            [ 5,  6,  7],
            [ 2,  3,  4],
            [ 8,  9, 10],
            [11, 12, 13]])
    

    【讨论】:

    • 这似乎没有考虑对这个结构很重要的索引 B 和 D。这似乎解决了这个玩具示例的奇异情况。我需要它在 B 和 D 中阅读,因为在某些情况下它很重要。例如,B = [0,1,1] D = [0, 0, 1, 2, 2]
    猜你喜欢
    • 2021-06-27
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    相关资源
    最近更新 更多