Python 如何创建torch.tensor对象并仅更新其部分元素?

Python 如何创建torch.tensor对象并仅更新其部分元素?,python,pytorch,tensor,gradient-descent,Python,Pytorch,Tensor,Gradient Descent,假设我想创建大小为[2,3]的torch.tensor对象,填充随机元素,我打算在网络中使用此矩阵并优化其值。然而,我只想更新矩阵中的一些值 我知道可以通过设置参数requires\u grad到True或False来实现张量。但是,下面的代码 z = torch.rand([2,3], requires_grad=True) z[-1][-1].requires_grad=False 没有按预期工作 RuntimeError: you can only change requires_gra

假设我想创建大小为[2,3]的torch.tensor对象,填充随机元素,我打算在网络中使用此矩阵并优化其值。然而,我只想更新矩阵中的一些值

我知道可以通过设置参数
requires\u grad
True
False
来实现张量。但是,下面的代码

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().
如何修复此运行时错误?如何初始化torch张量,然后定义哪些元素将具有
requires_grad=True

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

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

不会有错误,但也不会更改requires\u grad。

只有一个张量
只对其部分条目要求\u grad,这没有多大意义。
为什么不有两个单独的张量,一个是我们更新的(
需要_grad=True
),另一个是固定的(
需要_grad=False
)?然后,您可以合并它们以便于计算:

fixed=torch.rand([2,3],require\u grad=False)
upd=torch.rand([2,3],require_grad=True)
mask=torch.tensor([[0,1,0],[1,0,1]],require_grad=False)#如何将两者结合起来
#使用固定的“遮罩”组合它们:
z=掩模*固定+(1-掩模)*upd
显然,除了使用二进制
掩码
之外,您还可以使用其他方法组合
fixed
upd
例如,如果
upd
占据
z
的前两列和
fixed
的其余两列,则:

fixed=torch.rand([2,1],require\u grad=False)
upd=torch.rand([2,2],require_grad=True)
#用浓缩法将它们结合起来
z=焊炬。类别(upd,固定),尺寸=1)
或者,如果你知道指数的话

fidx=torch.tensor([0,2],dtype=torch.long)
uidx=火炬张量([1,3,4,5],dtype=火炬长)
固定=火炬.rand([2,],require_grad=False)
upd=torch.rand([4,],require_grad=True)
z=火炬。空([2,3])
z[fidx]=固定
z[uidx]=upd

谢谢。我将尝试你的想法和下面的代码
fixed=torch.rand([2,3])upd=torch.from_numpy(fixed.data.numpy())upd.require_grad=True mask=torch.tensor([0,1,0.],[1,0,1.])z=mask*fixed+(1-mask)*upd
我担心的是我在做不必要的计算。在这个例子中,对于[2,3]张量来说,这不是一个大问题,但是如果有超过一百万个元素,这将是一个大问题。此外,在意识形态上,我甚至不需要这个掩码,我知道不应该更新的元素的索引。您提到的其他方法是什么?@user48115如果您的“屏蔽”元素遵循特定的模式,您可能会将
固定
upd
作为较小的张量,而
z
是通过连接它们来创建的。请看我的更新。