如何防止使用函数更改初始 pytorch 变量?

How to prevent the initial pytorch variable from changing using a function?

我想对变量 x 应用一个函数并保存为 y。但是为什么x也变了呢?如何预防?

import torch
def minus_min(raw):
  for col_i in range(len(raw[0])):
    new=raw
    new[:,col_i] = (raw[:,col_i] - raw[:,col_i].min())
  return new

x=torch.tensor([[0,1,2,3,4],
                [2,3,4,0,8],
                [0,1,2,3,4]])
y=minus_min(x)
print(y)
print(x)

输出:

tensor([[0, 0, 0, 3, 0],
        [2, 2, 2, 0, 4],
        [0, 0, 0, 3, 0]])
tensor([[0, 0, 0, 3, 0],
        [2, 2, 2, 0, 4],
        [0, 0, 0, 3, 0]])

因为这个作业:

new[:,col_i] = (raw[:,col_i] - raw[:,col_i].min())

是就地操作。因此,xy将共享基础.data

解决此问题的最小更改是在函数内复制 x

def minus_min(raw):
  new = raw.clone()  # <--- here
  for col_i in range(len(raw[0])):
    new[:,col_i] = raw[:,col_i] - raw[:,col_i].min()
  return new

如果需要,您可以简化函数(并删除 for 循环):

y = x - x.min(dim=0).values