为什么火炬转置返回一个不连续的张量,但等效的视图操作返回一个连续的?

乘风 pytorch 201

原文标题Why does torch transpose return a non-contiguous tensor but the equivalent view operation returns a contiguous one?

torch.Tensor.view()torch.tensor.transpose()都可以转置二维张量,例如

a = torch.arange(8).reshape(2, 4)
a.t().is_contiguous() # False
a.view(4,2).is_contiguous() # True

但是用.view()交换维度会产生一个连续的张量,而使用.t()会导致一个不连续的张量。显然,在保持连续性的同时可以进行转置,虽然我不太明白如何,但我的主要问题是:为什么这两个函数的行为不同?

view文档说“返回的张量共享相同的数据”和transpose“结果out张量与input张量共享其底层存储”,所以我天真地期望两个函数的输出的连续状态是相同的,但也许“共享相同的数据”和“共享底层存储”是两个不同的东西?

编辑:我没有想到有一种方法可以将这个张量重新整形为 4,2 而不是 lol。感谢接受答案的作者指出 at() != a.view(dim1, dim0) .

原文链接:https://stackoverflow.com//questions/71407872/why-does-torch-transpose-return-a-non-contiguous-tensor-but-the-equivalent-view

回复

我来回复
  • aretor的头像
    aretor 评论

    使用view(4, 2)你不是在转置张量,你只是在重塑它。

    原始张量:

    t = torch.tensor([[1, 2],
                      [3, 4],
                      [5, 6],
                      [7, 8]])
    
    

    t.transpose()回报:

    torch.tensor([[1, 3, 5, 7],
                  [2, 4, 6, 8]])
    

    t.view(4, 2)回报:

    t.tensor([[1, 2, 3, 4],
              [5, 6, 7, 8]])
    
    2年前 0条评论