为啥在复制张量时建议使用 Tensor.clone().detach()?
Posted
技术标签:
【中文标题】为啥在复制张量时建议使用 Tensor.clone().detach()?【英文标题】:Why Tensor.clone().detach() is recommended when copying a tensor?为什么在复制张量时建议使用 Tensor.clone().detach()? 【发布时间】:2020-10-10 13:33:57 【问题描述】:使用torch.tensor(sourcetensor)
和tensor.clone().detach()
复制张量有什么区别?
就像torch.tensor(srctsr)
总是复制数据,tensor.clone().detach()
也复制数据。
x = torch.tensor([1, 2, 3])
y1 = x.clone().detach()
y2 = torch.tensor(x)
x[0] = 0
print(y1, y2) # both are same
所以它们看起来完全一样。以下是 PyTorch 文档中关于 torch.tensor()
和 torch.clone().detach()
的解释
因此 torch.tensor(x) 等价于 x.clone().detach() 并且 torch.tensor(x, requires_grad=True) 等价于 x.clone().detach().requires_grad_(True) .推荐使用 clone() 和 detach() 的等价物。
那么如果它们彼此等价,为什么.clone().detach()
比另一个更受欢迎?
【问题讨论】:
这能回答你的问题吗? Pytorch preferred way to copy a tensor 好的。 “x 轴是创建的张量的维度,y 轴显示时间。该图是线性比例的。正如您所看到的,与其他三种方法相比,tensor() 或 new_tensor() 需要更多时间。”但是为什么会这样呢? 你最好在 PyTorch 官方论坛上提问,因为开发人员可以更好地回答。 【参考方案1】:区别描述在here。为了完整起见,我正在添加一些文本(来自链接)。
torch.tensor() 总是复制数据。如果你有张量数据并且想避免复制,请使用 torch.Tensor.requires_grad_() 或 torch.Tensor.detach()。
当 data 是张量 x 时,torch.tensor() 从传递的任何内容中读取“数据”,并构造一个叶变量。因此 torch.tensor(x) 等价于 x.clone().detach() 并且 torch.tensor(x, requires_grad=True) 等价于 x.clone().detach().requires_grad_(True)。推荐使用 clone() 和 detach() 的等价物。
【讨论】:
我也读过。但是,区别尚不清楚。我添加了详细信息。 我想做x.clone().detach()
,但是如果x
是一个整数,我怎样才能使x
成为一个实际的张量?
@tailsparkrabbitear 你可以使用x_tensor = torch.tensor([x])
制作张量以上是关于为啥在复制张量时建议使用 Tensor.clone().detach()?的主要内容,如果未能解决你的问题,请参考以下文章
为啥不建议数组使用 JavaScript 的 For...In 循环? [复制]
为啥 resnet50 的 MaxPool2d 层在 tensorboard 中可视化时会输出 2 个张量?