python - 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
如果两者等效,那么在深度复制张量方面哪种方法更好?
解决方案
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即主要是神经网络对象而不是张量。
克隆()
使用此方法复制张量。
推荐阅读
- architecture - 为什么现代处理器仍然使用有序流水线?
- jquery - Fantasybox首先加载到我的页面图标下并疯狂放大
- python - Django 没有将 Heroku Websokect 路由到 dyno
- asp.net-core-2.0 - 身份服务器脱机时验证 access_token
- c# - 参数中的委托
- python - 尝试在没有 forms.py 的情况下使用文件上传 - 'InMemoryUploadedFile' 对象不可调用
- vba - 如何快速切换 VBA 中正在编辑的工作表/工作簿
- reactjs - 如何重构这个新组件?
- java - 如何检查抽象对象的实例是否属于特定的子类
- machine-learning - Azure 机器学习中的图像分类