首页 > 解决方案 > Pytorch:copy.deepcopy 与 torch.tensor.contiguous()?

问题描述

在 python 火炬中,似乎copy.deepcopy方法通常用于创建火炬张量的深层副本,而不是创建现有张量的视图。同时,据我了解,该torch.tensor.contiguous()方法将非连续张量转换为连续张量,或者将视图转换为深度复制的张量。

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

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

标签: pythonpytorchtorch

解决方案


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

>>> 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

连续()

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

深拷贝()

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

克隆()

使用此方法复制张量


推荐阅读