如何创建torch.tensor对象并仅更新其某些元素?

时间:2019-08-27 05:51:31

标签: python pytorch tensor gradient-descent

比方说,我想创建大小为[2,3]的torch.tensor对象,其中填充了随机元素,并且打算在网络中使用此矩阵并优化其值。但是,我只想更新矩阵中的某些值。

我知道可以通过将参数requires_grad设置为TrueFalse来完成张量。但是,以下代码

z = torch.rand([2,3], requires_grad=True)
z[-1][-1].requires_grad=False

不能按预期工作

RuntimeError: you can only change requires_grad flags of leaf variables. If you want to use a computed variable in a subgraph that doesn't require differentiation use var_no_grad = var.detach().

如何解决此RuntimeError?如何初始化割炬张量,然后定义其中会有requires_grad =True的元素?

如果我以类似的方式编写代码:

z = torch.rand([2,3], requires_grad=False)
z[-1][-1].requires_grad=True

不会有错误,但是require_grad也没有变化。

1 个答案:

答案 0 :(得分:2)

只有一个{em {1}}仅用于其部分条目的单个张量并没有多大意义。
为什么没有两个张量张量张量我们更新(requires_grad而另一个固定张量(requires_grad=True)?然后,您可以合并它们以简化计算:

requires_grad=False

除了使用二进制fixed = torch.rand([2, 3], require_grad=False) upd = torch.rand([2, 3], require_grad=True) mask = torch.tensor([[0, 1, 0], [1, 0, 1]], require_grad=False) # how to combine the two # combine them using fixed "mask": z = mask * fixed + (1-mask) * upd 以外,显然还有其他结合fixedupd的方法。
例如,如果mask占据了upd的前两列,而z则占据了其余两列,则:

fixed

或者,如果您知道索引

fixed = torch.rand([2, 1], require_grad=False)
upd = torch.rand([2, 2], require_grad=True)
# combine them using concatination
z = torch.cat((upd, fixed),dim=1)