参考:
https://zhuanlan.zhihu.com/p/64551412
https://stackoverflow.com/questions/26998223/what-is-the-difference-between-contiguous-and-non-contiguous-arrays/26999092#26999092
总结:
tensor经过permute以及transform之后,对应数据的存储并没有发生改变,改变的是数据读出的方式,而view函数是从内存中(python 中多维数组是按行存储的)读取出来数据,然而此时经过permute之后的数据由于本身的stride和size不满足contigous(连续关系),因此当需要使用view时,可以重新开辟一段内存空间,这里使用contigous的话,能够开辟一段新的内存空间,此时再使用view就没有什么问题了。
实验部分:
import torch
a = torch.tensor([[1,2,3],[4,5,6]])
a.data_ptr()
94632533370368
a.permute(1,0).contiguous().view(-1)
tensor([1, 4, 2, 5, 3, 6])
a.view(-1)
tensor([1, 2, 3, 4, 5, 6])
b = a.permute(1,0).contiguous()
c = a.permute(1,0)
c.data_ptr()
94632533370368
b.data_ptr()
94632533452096