我目前正在通过PyTorch开发一个解决方案,我不打算分享确切的解决方案,但我会提供代码来重现我遇到的问题。
我有一个模型定义如下:
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.fc1 = nn.Linear(10,4)
def foward(self,x):
return nn.functional.relu(self.fc1(x))
然后创建一个示例:my_model = Net()
。接下来我创建一个Adam
优化器,如下所示:
optim = Adam(my_model.parameters())
# create a random input
inputs = torch.tensor(np.array([1,1,1,1,1,2,2,2,2,2]),dtype=torch.float32,requires_grad=True)
# get the outputs
outputs = my_model(inputs)
# compute gradients / backprop via
outputs.backward(gradient=torch.tensor([1.,1.,1.,5.]))
# store parameters before optimizer step
before_step = list(my_model.parameters())[0].detach().numpy()
# update parameters via
optim.step()
# collect parameters again
after_step = list(my_model.parameters())[0].detach().numpy()
# Print if parameters are the same or not
print(np.array_equal(before_step,after_step)) # Prints True
我向Adam优化器提供了我的模型参数,所以我不确定为什么参数没有更新。我知道在大多数情况下使用损失函数,但是我不能在我的情况下这样做,但是我假设如果我向优化器指定模型参数,它会知道连接两者。
有人知道为什么参数没有更新吗?
1条答案
按热度按时间hmae6n7t1#
问题出在
detach
(docs)上,如底部所示:返回的Tensor与原始Tensor共享相同的存储空间。对其中任何一个的就地修改都将被看到,并可能在正确性检查中触发错误
这就是这里发生的事情,为了正确比较参数,你需要
clone
(docs)它们来得到一个真实的的副本。顺便说一句,如果你用
print(list(my_model.parameters())[0].grad)
检查optim.step()
之后的梯度,以检查图形是否完整,这会很有帮助。