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坐标应该修改