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

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中的值仍保持不变。如果是这种情况,那么out中此关键字参数torch.empty的目的是什么?我在这里想念什么?

最佳答案

Here's empty的C ++实现,源代码中没有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)


首先,empty不会释放内存-它只关心分配适当大小的张量。在您的情况下,这样的张量已经被分配了,所以empty没有任何关系..它不会在内存中的其他位置分配新的空张量。在上面的第二个empty示例中,我们被迫分配一个更大的张量(2 * 8 = 16,而5 * 3 = 15),并且我们可以看到该空数组中的最后一个元素是垃圾,因为它超出了先前已初始化的连续内存块。 empty不会强制将整个张量清除为0或类似的东西,因为同样,它是未初始化的数据。

关于python - torch.empty()中“out”参数的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52789086/

10-13 02:42