你的问题是,当你计算每个循环的时候,你不会把梯度调零。相反,通过设置
retain_graph=True
不打电话
opt.zero_grad()
在循环的每个步骤中,实际上都要添加计算得出的梯度
所有
以前计算的梯度。所以你不是在梯度下降中迈出一步,而是在
全部的
累积梯度,这当然不是你想要的。
你应该打电话给
零梯度选择
在循环开始时,移动
z=x*x
在你的循环里这样你就不必
retain_graph
.
我做了一些细微的修改:
import torch
from torch.autograd import Variable
tns = torch.FloatTensor([3])
x = Variable(tns, requires_grad=True)
opt = torch.optim.Adam([x], lr=.01, betas=(0.5, 0.999))
for i in range(3000):
opt.zero_grad()
z = x*x
z.backward() # Calculate gradients
opt.step()
print(x)
还有我的决赛
x
是
1e-25
.