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

Posted

技术标签:

【中文标题】Pytorch:copy.deepcopy 与 torch.tensor.contiguous()?【英文标题】:Pytorch: copy.deepcopy vs torch.tensor.contiguous()? 【发布时间】:2021-01-26 01:12:55 【问题描述】:

在python torch 中,似乎copy.deepcopy 方法通常用于创建torch 张量的深层副本,而不是创建现有张量的视图。 同时, 据我了解,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

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

【问题讨论】:

【参考方案1】:

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

连续()

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

deepcopy()

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

克隆()

使用此方法复制张量

【讨论】:

好的。因此,如果我要复制张量并且tensor.contiguous() 不是为深度复制张量创建的,则首选tensor.clone()。非常感谢! @hskim 是使用 clone() 方法复制张量

以上是关于Pytorch:copy.deepcopy 与 torch.tensor.contiguous()?的主要内容,如果未能解决你的问题,请参考以下文章

Python---copy()deepcopy()与赋值的区别

如何覆盖 Python 对象的复制/深度复制操作?

Python 的 copy.deepcopy 真的会复制所有内容吗? [复制]

python中的copy.copy和copy.deepcopy

Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

copy&deepcopy