首页 > 解决方案 > 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或. 为什么首选?表现?我认为它的可读性较差。dad

有什么理由支持/反对使用c

标签: copypytorchtensor

解决方案


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',
)

推荐阅读