首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >copy.deepcopy对torch.tensor.contiguous()?

copy.deepcopy对torch.tensor.contiguous()?
EN

Stack Overflow用户
提问于 2021-01-26 01:12:55
回答 1查看 3.2K关注 0票数 1

在python中,似乎通常使用copy.deepcopy方法创建火炬张量的深拷贝,而不是创建现有张量的视图。同时,据我所知,torch.tensor.contiguous()方法将一个非连续张量转化为一个连续张量,或者将一个视图转化为一个深拷贝张量。

然后,如果我想要将src_tensor深度复制到dst_tensor中,下面的两行代码是否可以等效地工作?

代码语言:javascript
复制
org_tensor = torch.rand(4)
src_tensor = org_tensor

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

如果这两种方法是等价的,哪一种方法在深度复制张量方面更好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-26 06:15:10

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

代码语言:javascript
复制
>>> 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张量。

代码语言:javascript
复制
>>> 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,即主要是神经网络对象而不是张量。

克隆()

使用此方法复制张量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65894586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档