为什么火炬转置返回一个不连续的张量,但等效的视图操作返回一个连续的?
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) .