调用.backward()时出现以下错误:
遇到RuntimeError:梯度运算所需的变量之一已被就地操作修改
代码如下:
for i, j, k in zip(X, Y, Z):
A[:, i, j] = A[:, i, j] + k
我尝试过.clone(),torch.add()等。
请帮助!
答案 0 :(得分:1)
在发表评论后,我对要完成的工作感到有些困惑。您提供的代码使用注释中提供的尺寸给我一个错误
Traceback (most recent call last):
A[:, i, j] = A[:, i, j] + k
RuntimeError: The size of tensor a (32) must match the size of tensor b (200) at non-singleton dimension 0
但这是我想您要执行的操作,如果这是错误的,请在评论中更正我...
给出张量X
,Y
和Z
,X
,Y
和Z
的每个条目对应于一个坐标( x,y)和值z。您要在坐标(x,y)上将z添加到A
中。在大多数情况下,批次维度保持独立,尽管不清楚您发布的代码中的情况。现在,我假设您要这样做。
例如,假设A
包含全零并且形状为3x4x5和X
,Y
是形状3x3,而Z
是形状3x3x1。在此示例中,假设A
包含所有以零开头的数字,并且X
,Y
和Z
具有以下值
X = tensor([[1, 2, 3],
[1, 2, 3],
[2, 2, 2]])
Y = tensor([[1, 2, 3],
[1, 2, 3],
[1, 1, 1]])
Z = tensor([[[0.1], [0.2], [0.3]],
[[0.4], [0.5], [0.6]],
[[0.7], [0.8], [0.9]]])
然后,我们希望A
在操作后具有以下值
A = tensor([[[0, 0, 0, 0, 0],
[0, 0.1, 0, 0, 0],
[0, 0, 0.2, 0, 0],
[0, 0, 0, 0.3, 0]],
[[0, 0, 0, 0, 0],
[0, 0.4, 0, 0, 0],
[0, 0, 0.5, 0, 0],
[0, 0, 0, 0.6, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 2.4, 0, 0, 0],
[0, 0, 0, 0, 0]]])
为此,我们可以利用index_add
函数,该函数允许我们添加到索引列表。由于这仅支持一维运算,因此我们首先需要将X
,Y
转换为线性张量A
的线性索引。然后,我们可以将其展开为原始形状。
layer_size = A.shape[1] * A.shape[2]
index_offset = torch.arange(0, A.shape[0] * layer_size, layer_size).unsqueeze(1)
indices = (X * A.shape[2] + Y) + index_offset
A = A.view(-1).index_add(0, indices.view(-1), Z.view(-1)).view(A.shape)