如何在torch.optim.LBFGS的优化器更新网络参数下限制网络权重的范围?
①网上搜到的限制网络权重范围的方法有2种:设置类/在训练中限制如下:
class weightConstraint(object):
def __init__(self):
pass
def __call__(self, module):
if hasattr(module, 'weight'):
# print("Entered")
w = module.weight.data
w = w.clamp(0,99) # 将参数范围限制到0-1之间
module.weight.data = w
或者
for p in net.parameters():
p.register_hook(lambda grad: torch.clamp(grad, 0,10))
这两种方法对Adam等优化器都有效果,但是我用的是LBFGS优化器,它的格式是要接收一个闭包的函数:
def loss_func_LBFGS(self):
theta_pred, k_pred, psi_pred = self.RRE_net(self.z,self.t)
theta_t_pred, psi_z_pred, psi_zz_pred, k_z_pred, f_pred=self.f_net(self.z_rre,self.t_rre)
loss = torch.mean((self.theta - theta_pred) ** 2)*10 + 0.1*torch.mean(f_pred ** 2)
#loss = torch.mean((self.theta - theta_pred) ** 2)
self.optimizer.zero_grad()
loss.backward()
self.iter += 1
print(self.iter,'======',loss.item())
return loss
self.optimizer.step(self.loss_func_LBFGS)
主要问题就出现在:我把这两种方法都加在这个闭包函数中添加了 都没用 不知道该如何修改?