copy - Pytorch 复制张量的首选方式
问题描述
似乎有几种方法可以在 Pytorch 中创建张量的副本,包括
y = tensor.new_tensor(x) #a
y = x.clone().detach() #b
y = torch.empty_like(x).copy_(x) #c
y = torch.tensor(x) #d
b
如果我执行a
或. 为什么首选?表现?我认为它的可读性较差。d
a
d
有什么理由支持/反对使用c
?
解决方案
TL;博士
使用.clone().detach()
(或最好.detach().clone()
)
如果您先分离张量然后克隆它,则不会复制计算路径,反之则复制然后放弃。因此,
.detach().clone()
效率要高得多。-- pytorch 论坛
因为它的作用有点快和明确。
使用perflot
,我绘制了复制 pytorch 张量的各种方法的时间。
y = tensor.new_tensor(x) # method a
y = x.clone().detach() # method b
y = torch.empty_like(x).copy_(x) # method c
y = torch.tensor(x) # method d
y = x.detach().clone() # method e
x 轴是创建张量的维度,y 轴显示时间。该图是线性比例的。可以清楚地看到,与其他三种方法相比,tensor()
或需要更多时间。new_tensor()
注意:在多次运行中,我注意到在 b、c、e 中,任何方法的时间都最短。对于 a 和 d 也是如此。但是,方法 b、c、e 的时序始终低于 a 和 d。
import torch
import perfplot
perfplot.show(
setup=lambda n: torch.randn(n),
kernels=[
lambda a: a.new_tensor(a),
lambda a: a.clone().detach(),
lambda a: torch.empty_like(a).copy_(a),
lambda a: torch.tensor(a),
lambda a: a.detach().clone(),
],
labels=["new_tensor()", "clone().detach()", "empty_like().copy()", "tensor()", "detach().clone()"],
n_range=[2 ** k for k in range(15)],
xlabel="len(a)",
logx=False,
logy=False,
title='Timing comparison for copying a pytorch tensor',
)
推荐阅读
- xml - 如何处理'
'元素并在新段落中转换字符串 - android - 位置在android中无法正常工作
- javascript - html 中有 2 个表单字段,即 reg no 和 full name。当使用 Javascript 输入与名称无关的 reg 时,我想填写全名
- html - 从数据库中搜索并使用spring boot + html将其显示在网页中
- html - 添加多个文件,并可以在提交表单之前删除选定的文件
- python - 如何对包含多个单引号字符串的 Like 或 Ilike 使用参数化查询
- c - C中的内存分配是否取决于机器?
- node.js - axios 请求不适用于外部 api 上的表单数据
- windows - 如何避免每次推送或拉取代码时都添加 ssh 密钥
- flutter - 如何用 Flutter 在 initState 函数中一一调用异步函数