【发布时间】:2019-01-19 22:30:39
【问题描述】:
我想知道如何在 PyTorch 中处理就地操作。我记得在 autograd 中使用就地操作一直存在问题。
实际上,我很惊讶下面的这段代码可以正常工作,即使我没有测试过,我相信这段代码会在版本0.3.1 中引发错误。
基本上我想做的是将张量向量的某个位置设置为某个值,如下所示:
my_tensor[i] = 42
工作示例代码:
# test parameter a
a = torch.rand((2), requires_grad=True)
print('a ', a)
b = torch.rand(2)
# calculation
c = a + b
# performing in-place operation
c[0] = 0
print('c ', c)
s = torch.sum(c)
print('s ', s)
# calling backward()
s.backward()
# optimizer step
optim = torch.optim.Adam(params=[a], lr=0.5)
optim.step()
# changed parameter a
print('changed a', a)
输出:
a tensor([0.2441, 0.2589], requires_grad=True)
c tensor([0.0000, 1.1511], grad_fn=<CopySlices>)
s tensor(1.1511, grad_fn=<SumBackward0>)
changed a tensor([ 0.2441, -0.2411], requires_grad=True)
显然在0.4.1 版本中。这工作得很好,没有警告或错误。
参考文档中的这篇文章:autograd-mechanics
在 autograd 中支持就地操作是一件困难的事情,我们 在大多数情况下不鼓励使用它们。 Autograd 的激进缓冲区 释放和重用使其非常高效,并且很少 就地操作实际上会降低任何内存使用量的情况 数额可观。 除非您在大量内存下操作 压力,你可能永远不需要使用它们。
但即使它有效,在大多数情况下不鼓励使用就地操作。
所以我的问题是:
就地操作的使用对性能的影响有多大?
在我想将张量的一个元素设置为某个值的情况下,如何使用就地操作?
提前致谢!
【问题讨论】:
标签: python neural-network deep-learning pytorch autograd