PyTorch中的contiguous

官方文档

contiguous() → Tensor

Returns a
contiguous tensorcontaining the same data as self tensor. If self tensor is
contiguous, this function returns the self tensor.

详解:
官方文档说的不是很清楚,且contiguous这个词又不太好理解。参考 stack overflow的这个问答,这篇不是翻译
在pytorch中有一些操作,在内存层面上其实并不真正的改变(或者创建)一个tensor,它只是把index重新安排了。这些操作有:
narrow(),view(), expand() and transpose()
以下面为例:

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的了。
一般不需要担心这个,显然在用户层面上无法察觉到xy的不同之处。当torch需要一个contiguous的tensor,而你却给他传了一个non-contiguous的时候,它会报出Run time error,并提示你加上.contiguous

    原文作者:胡今朝
    原文地址: https://zhuanlan.zhihu.com/p/67095591
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞