在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如果这两种方法是等价的,哪一种方法在深度复制张量方面更好?
发布于 2021-01-26 06:15:10
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方法只是复制数据而没有将其转换为连续张量。
如果旧张量是non-contiguous,则contiguous只创建新张量,而deepcopy 总是创建新<代码>E 218张量。
>>> 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连体()
使用此方法将non-contiguous张量转换为连续张量。
深拷贝()
使用此方法复制 nn.Module,即主要是神经网络对象而不是张量。
克隆()
使用此方法复制张量。
https://stackoverflow.com/questions/65894586
复制相似问题