火炬: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 即主要是神经网络对象不是张量.
克隆()
使用此方法复制张量。
在 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 即主要是神经网络对象不是张量.
克隆()
使用此方法复制张量。