torch.contiguous()方法语义上是“连续的”,经常与torch.permute()、torch.transpose()、torch.view()方法一起使用,要理解这样使用的缘由,得从pytorch多维数组的低层存储开始说起:
touch.view()方法对张量改变“形状”其实并没有改变张量在内存中真正的形状,可以理解为:
- view方法没有拷贝新的张量,没有开辟新内存,与原张量共享内存;
- view方法只是重新定义了访问张量的规则,使得取出的张量按照我们希望的形状展现。
pytorch与numpy在存储MxN的数组时,均是按照行优先将数组拉伸至一维存储,比如对于一个二维张量
// An highlighted block
t = torch.tensor([[2, 1, 3], [4, 5, 9]])
在内存中实际上是
[2, 1, 3, 4, 5, 9]
按照行优先原则,数字在语义和在内存中都是连续的,当我们使用torch.transpose()方法或者torch.permute()方法对张量翻转后,改变了张量的形状
// An highlighted block
t2 = t.transpose(0, 1)
t2
tensor([[2,4],