官方文档:https://pytorch.org/docs/stable/generated/torch.Tensor.contiguous.html
其描述contiguous为:
Returns a contiguous in memory tensor containing the same data as self tensor. If self tensor is already in the specified memory format, this function returns the self tensor.
用大白话讲:将张量在内存上调整为连续。
内存上连续的张量:
内存上不连续的张量:
我们随便初始化的张量一开始都是连续张量,后来在计算中为了加速和节省存储,我们只会操作张量的索引,比如常见的narrow(), view(), expand() 和 transpose()等。这样就会产生在内存上不连续,或者索引值顺序乱序的情况。这样,就需要contiguous()来调整一下。
import torch
t = torch.tensor([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]])
print(t.is_contiguous())
# True
tt = t.T
print(tt.is_contiguous())
# False
tt_con = tt.contiguous()
print(tt.is_contiguous())
print(tt_con.is_contiguous())
# False
# True
由这个例子,我们可以看出,二维张量转置以后会变得不连续,我们用contiguous做连续化以后并不会覆盖原来的张量,而是重新开辟了一块地址来存储连续的新张量。所以,contiguous只是在存储上做调整,不会改变张量的值。
什么时候该用contiguous呢?答:当系统报错RuntimeError: input is not contiguous
的时候。
参考:https://stackoverflow.com/questions/48915810/what-does-contiguous-do-in-pytorch