首页 > 解决方案 > 如何使用函数防止初始 pytorch 变量发生变化?

问题描述

我想将函数应用于变量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]])

标签: functionpytorchtensor

解决方案


因为这个任务:

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

推荐阅读