【问题标题】:How to add a 2d tensor to every 2d tensor from a 3d tensor如何从 3d 张量向每个 2d 张量添加 2d 张量
【发布时间】:2019-05-11 08:08:14
【问题描述】:

我正在尝试将 2d 张量添加到 3d 张量中的每个 2d 张量。 假设我有一个带有 (2,3,2) 形状的张量 a 和一个带有 (2,2) 形状的张量 b

a = [[[1,2],
      [1,2],
      [1,2]],
     [[3,4],
      [3,4],
      [3,4]]]

b = [[1,2], [3,4]]

#the result i want to get
a[:, 0, :] + b
a[:, 1, :] + b
a[:, 2, :] + b

我想知道pytorch中是否有方法可以做到这一点。

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    这样做最有效的方法是向b 添加额外的第二维并使用广播添加:

    a = torch.Tensor([[[1,2],[1,2],[1,2]],[[3,4],[3,4],[3,4]]])
    b = torch.Tensor([[1,2],[3,4]])
    a += b.unsqueeze(1)
    

    【讨论】:

      【解决方案2】:

      你想做什么:

      a = [[[1,2],
            [1,2],
            [1,2]],
           [[3,4],
            [3,4],
            [3,4]]]
      
      b = [[1,2], [3,4]]
      
      a = torch.LongTensor(a)
      b = torch.LongTensor(b)
      
      a[:, 0, :] += b
      a[:, 1, :] += b
      a[:, 2, :] += b
      
      print(a)
      

      输出:

      tensor([[[2, 4],
               [2, 4],
               [2, 4]],
      
              [[6, 8],
               [6, 8],
               [6, 8]]])
      

      您可以执行以下相同的操作。

      a = (a.transpose(0, 1) + b).transpose(0, 1)
      print(a) # prints the same tensor
      

      【讨论】:

        【解决方案3】:

        @SinaAfrooze 提出的解决方案是正确的,但不是最快的。

        TL;DR:torch.add(b.unsqueeze(1), a) 更快。


        基准测试:

        import torch
        a = torch.Tensor([[[1,2],[1,2],[1,2]],[[3,4],[3,4],[3,4]]])
        b = torch.Tensor([[1,2],[3,4]])
        z = a + b.unsqueeze(1)
        
        %timeit k = torch.add(b.unsqueeze(1), a)
        4.08 µs ± 25.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
        
        %timeit z = a + b.unsqueeze(1)
        4.14 µs ± 29 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
        
        torch.equal(k, z)
        True
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-03
          • 2016-07-02
          • 1970-01-01
          • 2020-12-04
          • 2018-05-15
          • 2020-10-14
          • 2019-06-24
          • 1970-01-01
          相关资源
          最近更新 更多