我在尝试使用Adam优化器来获取神经网络之外的某些值。我的方法不起作用,所以我创建了一个简单的例子来测试是否能工作:
a = np.array([[0.0,1.0,2.0,3.0,4.0], [0.0,1.0,2.0,3.0,4.0]])b = np.array([[0.1,0.2,0.0,0.0,0.0], [0.0,0.5,0.0,0.0,0.0]])a = torch.from_numpy(a)b = torch.from_numpy(b)a.requires_grad = Trueb.requires_grad = Trueoptimizer = torch.optim.Adam( [b], lr=0.01, weight_decay=0.001 )iterations = 200for i in range(iterations ): loss = torch.sqrt(((a.detach() - b.detach()) ** 2).sum(1)).mean() loss.requires_grad = True optimizer.zero_grad() loss.backward() optimizer.step() if i % 10 == 0: print(b) print("loss:", loss)
我的直觉是b应该尽可能接近a以减少损失。但我发现b的任何值都没有变化,损失也保持完全相同。我在这里错过了什么?谢谢。
回答:
您对b
进行了分离,这意味着在反向传播时,梯度不会一直流向b
,即b
不会发生变化!此外,您不需要在loss
上设置requires_grad = True
,因为如果其中一个操作数有requires_grad
标志,这将自动完成。
loss = torch.sqrt(((a.detach() - b) ** 2).sum(1)).mean()