pytorch tensor数据存储与内存共享

  tensor分为头信息区(Tensor)存储区(Storage)信息区主要保存着tensor的形状(size)、步长(stride)、数据类型(type)等信息,而真正的数据则保存成连续数组,存储在存储区

  

  通过id(tensor.storage)来获取“存储区”,注意:id(tensor)与id(tensor.storage)不同,id(tensor)是整个tensor所占的内存地址(包括信息区和存储区),而 id(tensor.storage)只是该tensor存储区的内存地址,也就是说某几个tensor的存储区的内存地址可以相同(即他们共享数据)。

  1,切片操作:

  索引出来的结果与原数据共享内存(存储区内存地址相同,总内存地址不同)。

  [In]:   x=torch.zeros(2,2)  # x: [ [ 0,0]

                  [0,0] ]

      y=x[0,:]

      y+=1

      print(y)

      print(x)

      print(id(y)==id(x))

      print(id(y.storage)==id(x.storage))

  [Out]:

      y:[[1,1]]

      x:[[1,1]

       [0,0]]

      False

      True

  

  2, view方法:

  view可以用来改变tensor的形状,返回新的tensor。

  返回的tensor与原数据共享data,即存储区内存地址相同,总内存地址不同

  [In]    x=torch.zeros(2,2)  # x: [ [ 0,0]

                 [0,0] ]

        y=x.view(4,1)    

     y+=1

     print(y)

     print(x)

     print(id(y)==id(x))

     print(id(y.storage)==id(x.storage))

  [Out] y: [[1][1][1][1]]

     x: [[1, 1]

       [1,1]]

     False

     True

  

  3 detach,data方法:

  与tensor全切片时相同。

  4 numpy,from_numpy方法

  该方法将tensor与numpy相互转换,这两个函数所产生的tensor与numpy的数组共享内存(即存储区内存相同)。

      

     

  

    

原文地址:https://www.cnblogs.com/aijing/p/13355386.html