比方说,我想创建大小为[2,3]的torch.tensor对象,其中填充了随机元素,并且打算在网络中使用此矩阵并优化其值。但是,我只想更新矩阵中的某些值。
我知道可以通过将参数requires_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().
如何解决此RuntimeError?如何初始化割炬张量,然后定义其中会有requires_grad =True
的元素?
如果我以类似的方式编写代码:
z = torch.rand([2,3], requires_grad=False)
z[-1][-1].requires_grad=True
不会有错误,但是require_grad也没有变化。
答案 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
以外,显然还有其他结合fixed
和upd
的方法。
例如,如果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)