WYJ244 2023-08-10 23:18 采纳率: 0%
浏览 8

如何在torch.optim.LBFGS的优化器更新网络参数下限制网络权重的范围?

如何在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)

主要问题就出现在:我把这两种方法都加在这个闭包函数中添加了 都没用 不知道该如何修改?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-11 08:23
    关注

    【以下回答由 GPT 生成】

    LBFGS优化器在更新网络参数时无法直接使用方法一和方法二来限制权重范围。LBFGS优化器需要接收一个闭包函数作为参数,并且没有提供像register_hook方法一样的钩子函数来限制梯度。下面是一个可以使用的解决方案:

    1. 创建一个新的闭包函数,用于计算模型的损失和梯度;
    def closure():
        optimizer.zero_grad()
        output = net(input)
        loss = criterion(output, target)
        loss.backward()
        return loss
    
    1. 在闭包函数内部,通过调用clamp方法来限制权重范围;
    def closure():
        optimizer.zero_grad()
        output = net(input)
        loss = criterion(output, target)
        # 限制权重范围
        for p in net.parameters():
            p.data = p.data.clamp(0, 99)  
        loss.backward()
        return loss
    
    1. 使用LBFGS优化器,并在每次更新参数之前调用闭包函数进行梯度计算和参数更新;
    optimizer = torch.optim.LBFGS(net.parameters())
    
    def train():
        # ...
        optimizer.step(closure)
    

    这样,每次更新参数之前,都会对权重进行限制,然后再计算梯度和更新参数。

    这是一种可以在LBFGS优化器中限制权重范围的解决方案,希望对你有帮助。如果这个方案无法满足你的需求,请告诉我,我会尽力提供其他的解决方案。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 8月10日

悬赏问题

  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错
  • ¥15 拓扑学,凸集,紧集。。
  • ¥15 如何扩大AIS数据容量
  • ¥15 单纯型python实现编译报错
  • ¥15 c++2013读写oracle
  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助