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
)以避免它干扰梯度计算。
我想使用 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
)以避免它干扰梯度计算。