代码之家  ›  专栏  ›  技术社区  ›  kmario23 Mazdak

torch.empty()中“out”参数的奇怪行为

  •  1
  • kmario23 Mazdak  · 技术社区  · 6 年前

    我有一个这样的张量样本:

    In [137]: x = x.new_ones((5, 3), dtype=torch.double)    
    In [138]: x
    Out[138]: 
    tensor([[1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.]], dtype=torch.float64)
    

    现在,我想通过使用重写内容来释放这个张量的内存。 torch.empty() 这需要一个 out 争论。

    In [139]: torch.empty((5, 3), out=x)
    Out[139]: 
    tensor([[1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.]], dtype=torch.float64)
    

    但是,原始张量中的值 x 仍然保持不变。如果是这种情况,那么这个关键字参数的目的是什么 外面的 在里面 torch.empty ?我这里缺什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   miradulo    6 年前

    Here's C++实现 empty 源代码中的out参数。

    Tensor& empty_out(Tensor& result, IntList size) {
      if (result.is_sparse()) {
        result.sparse_resize_and_clear_(size, size.size(), 0);
      } else {
        result.resize_(size);
      }
      return result;
    }
    

    所以对于稠密张量,它所做的就是适当地调整张量的大小——在您的例子中,大小是相同的。

    In [21]: x = torch.ones((5, 3), dtype=torch.double)                                                                                                                                        
    
    In [22]: torch.empty((2, 3), out=x)                                                                                                                                                        
    Out[22]: 
    tensor([[1., 1., 1.],
            [1., 1., 1.]], dtype=torch.float64)
    
    In [23]: torch.empty((2, 8), out=x)                                                                                                                                                        
    Out[23]: 
    tensor([[ 1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
              1.0000e+00,  1.0000e+00,  1.0000e+00],
            [ 1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
              1.0000e+00,  1.0000e+00, 4.6631e-310]], dtype=torch.float64)
    

    首先, 空的 不释放内存-它只关心适当大小的张量的分配。在你的例子中,这样的张量已经被分配了,所以 空的 无事可做……它不会在内存的其他地方分配一个新的空张量。在第二 空的 上面的例子,我们被迫为一个更大的张量分配(2*8=16,而5*3=15),我们可以看到这个空数组中的最后一个元素是垃圾,因为它超出了先前初始化的连续内存块。 空的 不会强制清除整个张量为0或类似的值,因为它是未初始化的数据。