PyTorch:如何让张量中只有选定的元素是可微的?

PyTorch:如何让张量中只有选定的元素是可微的?,pytorch,Pytorch,现在,我有一个如下的用例 A = [[1,x,y], [1,2,3], [1,z,3]] A是一个torch.tensor如下 A = [[1,x,y], [1,2,3], [1,z,3]] 只有A中的x,y,z元素是可微的,其他元素只是常数 例如,如果cost=tr(A.A) 成本=14+2x+2y+6z 当我进行回溯时,我只想区分和更新x,y,z。当然,这个例子只是一个玩具的例子,而不是真正复杂的例子 如何实现这样的用例?我认为实现它的唯一方法是使用掩码张量将您不想修改的

现在,我有一个如下的用例

A = 
[[1,x,y], 
 [1,2,3],
 [1,z,3]]
A
是一个
torch.tensor
如下

A = 
[[1,x,y], 
 [1,2,3],
 [1,z,3]]
只有
A
中的
x,y,z
元素是可微的,其他元素只是常数

例如,如果
cost=tr(A.A)

成本=14+2x+2y+6z

当我进行回溯时,我只想区分和更新
x,y,z
。当然,这个例子只是一个玩具的例子,而不是真正复杂的例子


如何实现这样的用例?

我认为实现它的唯一方法是使用掩码张量将您不想修改的元素的渐变归零,如下所示:

A = torch.tensor([[1.0, 100, 100], [1, 2, 3], [1, 100, 3]])
# I have initialized your x,y,z to 100, so the mask should only have these set to 1
mask = (A==100).to(dtype=torch.float32)
#optimizer to backpropagate
opt = torch.optim.SGD([A], lr=1e-2)
# optimization loop
for i in range(10):
    # backprop the loss gradient
    (A.matmul(A)).diag().pow(2).sum().backward()
    # mask the gradients
    with torch.no_grad():
        A.grad *= mask
    # optimization step
    opt.step()
    A.grad.zero_()
print(A)
只有x、y、z坐标应该修改