机器学习与数据挖掘PyTorch

pytorch中的contiguous

2019-04-10  本文已影响0人  Yung968

官方文档

contiguous() → Tensor

Returns a contiguous tensor containing 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

上一篇下一篇

猜你喜欢

热点阅读