为什么 torch 转置 return 一个不连续的张量,而等效的视图操作 return 是一个连续的张量?
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,即 not 转置 lol。感谢已接受答案的作者指出 a.t() != a.view(dim1, dim0).
使用 view(4, 2)
你不是在转置张量,你只是在重塑它。
原始张量:
t = torch.tensor([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
t.transpose()
returns:
torch.tensor([[1, 3, 5, 7],
[2, 4, 6, 8]])
t.view(4, 2)
returns:
t.tensor([[1, 2, 3, 4],
[5, 6, 7, 8]])
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,即 not 转置 lol。感谢已接受答案的作者指出 a.t() != a.view(dim1, dim0).
使用 view(4, 2)
你不是在转置张量,你只是在重塑它。
原始张量:
t = torch.tensor([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
t.transpose()
returns:
torch.tensor([[1, 3, 5, 7],
[2, 4, 6, 8]])
t.view(4, 2)
returns:
t.tensor([[1, 2, 3, 4],
[5, 6, 7, 8]])