【问题标题】:Is there any pytorch function can combine the specific continuous dimensions of tensor into one?是否有任何pytorch函数可以将张量的特定连续维度合二为一?
【发布时间】:2018-12-02 02:57:52
【问题描述】:

让我们调用我正在寻找的函数“magic_combine”,它可以结合我给它的张量的连续维度。更具体地说,我希望它做以下事情:

a = torch.zeros(1, 2, 3, 4, 5, 6)  
b = a.magic_combine(2, 5) # combine dimension 2, 3, 4 
print(b.size()) # should be (1, 2, 60, 6)

我知道torch.view() 可以做类似的事情。但我只是想知道是否有更优雅的方式来实现目标?

【问题讨论】:

  • 如果提供的索引不连续,你会期望什么样的形状?例如。 a.magic_combine(0, 2, 4) 的形状应该是 (15, 2, 4, 6)(2, 15, 4, 6) 还是 (2, 4, 15, 6)
  • 感谢您的回复!我现在专注于连续情况,我没有用我最初的问题完美地表达它。我现在已经更正了。
  • 我认为不存在,但使用.view 应该很容易实现

标签: python deep-learning pytorch tensor


【解决方案1】:

我不确定您对“更优雅的方式”有什么想法,但Tensor.view() 的优点是不会为视图重新分配数据(原始张量和视图共享相同的数据),进行此操作重量很轻。

正如@UmangGupta 所提到的,包装这个函数来实现你想要的东西是相当直接的,例如:

import torch

def magic_combine(x, dim_begin, dim_end):
    combined_shape = list(x.shape[:dim_begin]) + [-1] + list(x.shape[dim_end:])
    return x.view(combined_shape)

a = torch.zeros(1, 2, 3, 4, 5, 6)
b = magic_combine(a, 2, 5) # combine dimension 2, 3, 4
print(b.size())
# torch.Size([1, 2, 60, 6])

【讨论】:

    【解决方案2】:
    a = torch.zeros(1, 2, 3, 4, 5, 6)
    b = a.view(*a.shape[:2], -1, *a.shape[5:])
    

    在我看来比当前接受的答案要简单一些,并且不通过 list 构造函数(3 次)。

    【讨论】:

      【解决方案3】:

      torch einops 也可以。

      Github.

      > pip install einops
      
      from einops import rearrange
      
      a = torch.zeros(1, 2, 3, 4, 5, 6)
      b = rearrange(a, 'd0 d1 d2 d3 d4 d5 -> d0 d1 (d2 d3 d4) d5')
      

      【讨论】:

        【解决方案4】:

        flatten 有一个变体,它采用start_dimend_dim 参数。您可以像 magic_combine 一样调用它(除了 end_dim 包含在内)。

        a = torch.zeros(1, 2, 3, 4, 5, 6)  
        b = a.flatten(2, 4) # combine dimension 2, 3, 4 
        print(b.size()) # should be (1, 2, 60, 6)
        

        https://pytorch.org/docs/stable/generated/torch.flatten.html

        还有一个对应的unflatten,您可以在其中指定要展开的尺寸和要展开的形状。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-10
          • 2021-06-10
          • 2020-08-26
          • 2020-11-16
          • 2018-06-20
          • 2020-09-26
          • 2019-09-15
          • 1970-01-01
          相关资源
          最近更新 更多