【问题标题】:How to repeat tensor in a specific new dimension in PyTorch如何在 PyTorch 中的特定新维度中重复张量
【发布时间】:2020-01-13 17:17:09
【问题描述】:

如果我有一个形状为[M, N] 的张量A, 我想重复张量 K 次,以便结果 B 具有形状 [M, K, N] 并且每个切片B[:, k, :] 应该具有与A 相同的数据。 这是没有 for 循环的最佳实践。 K 可能在其他维度。

torch.repeat_interleave()tensor.repeat() 似乎不起作用。或者我用错了。

【问题讨论】:

  • 也许吧。如果您包含您正在使用的实际代码会很有帮助

标签: pytorch repeat


【解决方案1】:

tensor.repeat 应该适合您的需要,但您需要先插入一个单一维度。为此,我们可以使用tensor.unsqueezetensor.reshape。由于unsqueeze 专门定义为插入一个单一维度,我们将使用它。

B = A.unsqueeze(1).repeat(1, K, 1)

代码说明 A.unsqueeze(1)A[M, N] 转换为 [M, 1, N] 并且 .repeat(1, K, 1) 在第二维上重复张量 K 次。

【讨论】:

    【解决方案2】:

    Einops提供重复功能

    import einops
    einops.repeat(x, 'm n -> m k n', k=K)
    

    repeat可以任意顺序添加任意数量的轴,同时重新洗牌现有的轴。

    【讨论】:

      【解决方案3】:

      添加到@Alleo 提供的答案。您可以使用以下 Einops 函数。

      einops.repeat(example_tensor, 'b h w -> (repeat b) h w', repeat=b)
      

      其中b 是您希望张量重复的次数,hw 是张量的附加维度。

      例子-

      example_tensor.shape -> torch.Size([1, 40, 50]) 
      repeated_tensor = einops.repeat(example_tensor, 'b h w -> (repeat b) h w', repeat=8)
      repeated_tensor.shape -> torch.Size([8, 40, 50]) 
      

      更多示例在这里 - https://einops.rocks/api/repeat/

      【讨论】:

        【解决方案4】:

        重复值会占用大量内存,在大多数情况下,最佳做法是使用广播。所以你会使用A[:, None, :],这会变成A.shape==(M, 1, N)

        我同意重复这些值的一种情况是以下步骤中的就地操作。 由于 numpy 和 torch 在它们的实现上不同,我喜欢不可知 (A * torch.ones(K, 1, 1))) 后跟转置。

        【讨论】:

          猜你喜欢
          • 2022-07-26
          • 2017-09-05
          • 2021-06-10
          • 2020-04-13
          • 2021-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-25
          相关资源
          最近更新 更多