pytorch中的contiguous
官方文档
contiguous() → Tensor
Returns a
contiguous tensor
containing the same data as self tensor. If self tensor iscontiguous
, this function returns the self tensor.
详解:
官方文档说的不是很清楚,且contiguous这个词又不太好理解。参考 stack overflow的这个问答,这篇不是翻译。
在pytorch中有一些操作,在内存层面上其实并不真正的改变(或者创建)一个tensor,它只是把index重新安排了。这些操作有:
narrow()
,view()
,expand()
andtranspose()
以下面为例:
x = torch.ceil(torch.randn(3, 2)*100) # 为了方便好看数据
x
# tensor([[ -53., -102.],
# [ 64., 61.],
# [-211., 12.]])
y = torch.transpose(x, 0, 1)
y
# tensor([[ -53., 64., -211.],
# [-102., 61., 12.]])
看起来x和y这两个创建操作好像是一样的:都创建了一个新的tensor,但是其实在内存上的安排完全不一样法。
对于x,在一个整块的内存中产生了一个tensor,对于y,其实并没有创建新的tensor,torch只是把x的index重新安排了一下而已(虽然用起来好像没什么区别)。x是contiguous的,而y不是contiguous的。
但“contiguous”这个词有一定的误导作用,“non-contiguous”的含义不是说在tensor的内容在内存上不相连。内容在内存上仍然是相连的,只是元素的顺序不同!
当你使用tensor.contiguous
的时候,其实是在内存中复制了一个新的tensor,而这个tensor就是contiguous的了。
一般不需要担心这个,显然在用户层面上无法察觉到x
和y
的不同之处。当torch需要一个contiguous的tensor,而你却给他传了一个non-contiguous的时候,它会报出Run time error
,并提示你加上.contiguous
。