Pytorch 模型梯度打印正确但复制错误

Pytorch model gradients are printed correctly but copied wrongly

我想使用 pytorch 为不同的数据样本复制关于权重的损失梯度。在下面的代码中,我每次从数据加载器(批量大小 = 1)迭代一个样本,并为第一个完全连接的 (fc1) 层收集梯度。不同样本的梯度应该不同。打印功能显示正确的梯度,不同的样本是不同的。但是当我将它们存储在列表中时,我会重复获得相同的渐变。任何建议将不胜感激。提前致谢!

grad_list = [ ]

for data in test_loader:
  inputs, labels = data[0], data[1]
  inputs = torch.autograd.Variable(inputs)
  labels = torch.autograd.Variable(labels)

  # zero the parameter gradients
  optimizer.zero_grad()

  # forward + backward 
  output = target_model(inputs)
  loss = criterion(output, labels)
  loss.backward()

  grad_list.append(target_model.fc1.weight.grad.data)
  print(target_model.fc1.weight.grad.data)

尝试使用克隆和分离:

grad_list.append(target_model.fc1.weight.grad.clone().detach())

您要附加到列表的 data 属性 是对参数存储的可变引用(即实际内存地址和其中包含的值)。您需要做的是创建梯度张量的副本(clone)并将其从计算图中删除(detach)以避免它干扰梯度计算。