【发布时间】:2019-08-11 11:09:53
【问题描述】:
似乎有几种方法可以在 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
根据如果我执行a 或d 得到的用户警告,b 明显优于a 和d。为什么首选?表现?我认为它的可读性较差。
有什么理由支持/反对使用c?
【问题讨论】:
-
b的一个优点是它明确表明y不再是计算图的一部分,即不需要梯度。c与所有 3 个不同,y仍然需要 grad。 -
torch.empty_like(x).copy_(x).detach()和a/b/d一样吗?我认识到这不是一个聪明的方法,我只是想了解 autograd 是如何工作的。 docs forclone()说“与 copy_() 不同,此函数记录在计算图中”让我感到困惑,这让我认为copy_()不需要 grad。 -
文档中有一个非常明确的注释:
When data is a tensor x, new_tensor() reads out ‘the data’ from whatever it is passed, and constructs a leaf variable. Therefore tensor.new_tensor(x) is equivalent to x.clone().detach() and tensor.new_tensor(x, requires_grad=True) is equivalent to x.clone().detach().requires_grad_(True). The equivalents using clone() and detach() are recommended. -
Pytorch '1.1.0' 现在推荐 #b 并在 #d 中显示警告
-
@ManojAcharya 可能会考虑在此处添加您的评论作为答案。