pytorch中的contiguous

作者: Yung968 | 来源:发表于2019-04-10 11:25 被阅读0次

    官方文档

    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

    相关文章

      网友评论

        本文标题:pytorch中的contiguous

        本文链接:https://www.haomeiwen.com/subject/tkxniqtx.html