如何在不使用就地操作的情况下交换 PyTorch 张量中的值(保留梯度)
How to swap values in PyTorch tensor without using in-place operation (conserve gradient)
我有一个名为 state
的张量,形状为 torch.Size([N, 2**n, 2**n])
,我想应用以下操作:
state[[0,1]] = state[[1,0]]
state[0] = -1*state[0]
这两个都是就地操作。是否有一些不合适的操作可以替代它们?这些行 在 for 循环 内,因此仅创建新变量会有点困难。
我想通了!
替换:
state[[0,1]] = state[[1,0]] # in-place operation
与:
state = state[[1,0]] # out-of-place operation
对于第二行,我们替换:
state[0] = -1*state[0] # in-place operation
与:
# out-of-place operations
temp = torch.ones(state.shape).type(state.type()).to(state.device)
temp[1] = -1*temp[1]
state = state*temp
这似乎可以解决问题![=14=]
我有一个名为 state
的张量,形状为 torch.Size([N, 2**n, 2**n])
,我想应用以下操作:
state[[0,1]] = state[[1,0]]
state[0] = -1*state[0]
这两个都是就地操作。是否有一些不合适的操作可以替代它们?这些行 在 for 循环 内,因此仅创建新变量会有点困难。
我想通了!
替换:
state[[0,1]] = state[[1,0]] # in-place operation
与:
state = state[[1,0]] # out-of-place operation
对于第二行,我们替换:
state[0] = -1*state[0] # in-place operation
与:
# out-of-place operations
temp = torch.ones(state.shape).type(state.type()).to(state.device)
temp[1] = -1*temp[1]
state = state*temp
这似乎可以解决问题![=14=]