火炬:copy.deepcopy vs torch.tensor.contiguous()?

Pytorch: copy.deepcopy vs torch.tensor.contiguous()?

在 python torch 中,似乎 copy.deepcopy 方法通常用于创建 torch 张量的深层副本,而不是创建现有张量的 views。 同时, 据我所知,torch.tensor.contiguous() 方法将非连续张量变成连续张量,或者将 view 变成深度复制的张量。

然后,如果我想将 src_tensor 深度复制到 dst_tensor,下面的两行代码是否等效?

org_tensor = torch.rand(4)
src_tensor = org_tensor

dst_tensor = copy.deepcopy(src_tensor) # 1
dst_tensor = src_tensor.contiguous() # 2

如果两者等效,哪种方法在深度复制张量方面更好?

torch.tensor.contiguous()copy.deepcopy()方法不同。插图如下:

>>> x = torch.arange(6).view(2, 3)
>>> x
tensor([[0, 1, 2],
        [3, 4, 5]])
>>> x.stride()
(3, 1)
>>> x.is_contiguous()
True
>>> x = x.t()
>>> x.stride()
(1, 3)
>>> x.is_contiguous()
False
>>> y = x.contiguous()
>>> y.stride()
(2, 1)
>>> y.is_contiguous()
True
>>> z = copy.deepcopy(x)
>>> z.stride()
(1, 3)
>>> z.is_contiguous()
False
>>>

在这里我们可以很容易地看到 .contiguous() 方法从非连续张量创建了 连续 张量,而 deepcopy 方法只是复制数据而没有将其转换为连续张量。

还有一件事 contiguous 创建 张量 如果旧张量 不连续deepcopy always 创建 new 张量。

>>> x = torch.arange(10).view(2, 5)
>>> x.is_contiguous()
True
>>> y = x.contiguous()
>>> z = copy.deepcopy(x)
>>> id(x)
2891710987432
>>> id(y)
2891710987432
>>> id(z)
2891710987720

连续的()

使用此方法将非连续张量转换为连续张量。

deepcopy()

使用它来复制 nn.Module 即主要是神经网络对象不是张量.

克隆()

使用此方法复制张量