我想在培训过程中切换优化器 从LBFGS到Adam。 下面是我编写的代码。
optimizer = optim.LBFGS(model.parameters(), lr=0.003)
Use_Adam_optim_FirstTime=True
Use_LBFGS_optim=True
for epoch in range(30000):
loss_SUM = 0
for i, (x, t) in enumerate(GridLoader):
x = x.to(device)
t = t.to(device)
if Use_LBFGS_optim:
def closure():
optimizer.zero_grad()
lg, lb, li = problem_formulation(x, t, x_Array,t_Array,bndry,pi)
loss_total=lg+ lb+ li
loss_total.backward(retain_graph=True)
return loss_total
loss_out=optimizer.step(closure)
loss_SUM+=loss_out.item()
elif Use_Adam_optim_FirstTime:
Use_Adam_optim_FirstTime=False
optimizerAdam = optim.Adam(model.parameters(), lr=0.0003)
model.load_state_dict(checkpoint['model'])
optimizerAdam.zero_grad()
lg, lb, li = problem_formulation(x, t, x_Array,t_Array,bndry,pi)
lg.backward()
lb.backward()
li.backward()
optimizerAdam.step()
loss_SUM += lg.item()+lb.item()+li.item()
else:
optimizerAdam.zero_grad()
lg, lb, li = problem_formulation(x, t, x_Array,t_Array,bndry,pi)
lg.backward()
lb.backward()
li.backward()
optimizerAdam.step()
loss_SUM += lg.item()+lb.item()+li.item()
if loss_SUM<.3 and use_LBFGS_optim == True:
Use_LBFGS_optim=False
checkpoint = {'model': model.state_dict(),
'optimizer': optimizer.state_dict()}
我的问题是:
关于关闭功能:
(1)有什么方法可以从闭包函数返回多个变量?
(2)有没有一种方法可以使我在闭包函数中倒退三个而不是一个?
(3)为什么需要在关闭函数的loss_total.backward(retain_graph = True)中将keep_graph设置为True
(4)有时,关闭函数的loss_SUM接近1e + 29。有办法避免这个问题吗?
#-----------------------------
关于从LBFGS到Adam的切换:
(5)当loss_SUM <0.3并转到“ elif”部分时,损耗减少了一个时期, loss_SUM急剧增加(例如20倍)
将优化器从LBFGS切换到Adam的正确方法是什么
一般来说,以上代码有什么问题,我该如何改进?