我想知道如何处理派火炬的现场行动。我记得用带签名的原位手术一直是个问题。
实际上,我很惊讶下面的代码能够正常工作,尽管我没有测试过它,但我相信这段代码会在version0.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)

很明显,在版本中。这是正常的,没有警告或错误。
参考文档中的这篇文章:autograd-mechanics
在亲笔签名中支持就地操作是一件困难的事情,而且我们
在大多数情况下不鼓励使用它们。签名的攻击缓冲
释放和重用使其非常高效,而且很少
当就地操作实际上降低了内存使用率时
大量。除非你的记忆力很强
压力,你可能永远不需要使用它们。
但是,即使它有效,在大多数情况下也不鼓励使用就地操作。
所以我的问题是:
就地操作的使用对性能有多大影响?
在我想将张量的一个元素设置为某个值的情况下,如何使用就地操作?
事先谢谢!

最佳答案

我不确定就地操作对性能的影响有多大,但我可以处理第二个查询。您可以使用遮罩而不是就地操作。

a = torch.rand((2), requires_grad=True)
print('a ', a)
b = torch.rand(2)

# calculation
c = a + b

# performing in-place operation
mask = np.zeros(2)
mask[1] =1
mask = torch.tensor(mask)
c = c*mask
...

关于python - 使用PyTorch进行就地操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51818163/

10-12 17:02