pytorch optimizer.step()不更新模型权重/参数

o2g1uqev  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(543)

我目前正在通过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优化器提供了我的模型参数,所以我不确定为什么参数没有更新。我知道在大多数情况下使用损失函数,但是我不能在我的情况下这样做,但是我假设如果我向优化器指定模型参数,它会知道连接两者。
有人知道为什么参数没有更新吗?

hmae6n7t

hmae6n7t1#

问题出在detachdocs)上,如底部所示:
返回的Tensor与原始Tensor共享相同的存储空间。对其中任何一个的就地修改都将被看到,并可能在正确性检查中触发错误
这就是这里发生的事情,为了正确比较参数,你需要clonedocs)它们来得到一个真实的的副本。

list(my_model.parameters())[0].clone().detach().numpy()

顺便说一句,如果你用print(list(my_model.parameters())[0].grad)检查optim.step()之后的梯度,以检查图形是否完整,这会很有帮助。

相关问题