形式:Tensor.contiguous(memory_format=torch.contiguous_format) → Tensor
作用:返回一个连续的内存张量,其中包含与自张量相同的数据。如果 self tensor 已经是指定的内存格式,则此函数返回 self tensor。
参数:memory_format (torch.memory_format, optional)
返回的张量所需的内存格式。默认值:torch.contiguous_format。
理解:
这涉及到pytorch对张量的描述与存储之间的关系。一些tensor操作,不会改变tensor内容本身,而是重新定义下标与元素之间的对应关系。下标与元素之间的对应关系就是元数据。例如会改元数据的有:
- transpose()
- view()
以transpose()
为例,其作用是对tensor进行转置操作,该操作执行后并不会生成新的tensor。如下代码,经过transpose操作之后,改变了b,a也随着变化。
import torch
a = torch.randn(2, 3)
b = a.transpose(0, 1)
print("before modify")
print('a:', a)
print('b:', b)
b[1, 1] = 5
print("end modify")
print('a:', a)
print('b:', b)
输出结果如下:
before modify
a: tensor([[-1.0912, -0.0348, -0.8400],
[-0.2839, 0.0912, -1.3085]])
b: tensor([[-1.0912, -0.2839],
[-0.0348, 0.0912],
[-0.8400, -1.3085]])
end modify
a: tensor([[-1.0912, -0.0348, -0.8400],
[-0.2839, 5.0000, -1.3085]])
b: tensor([[-1.0912, -0.2839],
[-0.0348, 5.0000],
[-0.8400, -1.3085]])
那么这时,我们就认为a是contiguous的,b就不是了。当然我们也可以使用如下函数查看:
print(a.is_contiguous()) # True
print(b.is_contiguous()) # False
那么使用contiguous()的作用就是:断开这两个张量之间的联系,新的张量在内存中开辟新的内存空间。