如何防止使用函数更改初始 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())
是就地操作。因此,x
和y
将共享基础.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
我想对变量 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())
是就地操作。因此,x
和y
将共享基础.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