代码之家  ›  专栏  ›  技术社区  ›  Shai

如何用lambda函数保存pytorch中的LambdaLR调度程序?

  •  2
  • Shai  · 技术社区  · 6 年前

    在使用python 3.6运行pytorch 0.4.1时,我遇到了以下问题:
    我不能 torch.save

    lambda1 = lambda epoch: epoch // 30
    scheduler = LambdaLR(optimizer, lr_lambda=lambda1)
    torch.save(scheduler.state_dict(), 'scheduler.pth.tar')
    

    有错误的结果

    PicklingError: Can't pickle <function <lambda> at 0x7f7583fe92f0>:
    attribute lookup <lambda> on __main__ failed
    

    如何保存计划程序?


    lambda1 可以保存,但我需要一个lambda函数,因为我希望在定义此函数时能够控制它(例如,我希望能够更改分母中的固定30)。
    如何做到这一点,仍然允许我保存调度程序?

    2 回复  |  直到 6 年前
        1
  •  6
  •   Shai    6 年前

    如果一个人想保持他的默认行为 torch.save torch.load

    class LRPolicy(object):
        def __init__(self, rate=30):
            self.rate = rate
    
        def __call__(self, epoch):
            return epoch // self.rate
    

    调度程序现在正在运行

    scheduler = LambdaLR(optimizer, lr_lambda=LRPolicy(rate=30))
    

    现在调度程序可以 火炬。救命 埃德和 无需交替酸洗模块。

        2
  •  2
  •   Umang Gupta    6 年前

    你可以使用 dill 作为pickle模块而不是默认pickle。

    import dill
    torch.save(scheduler.state_dict(), 'scheduler.pth.tar', pickle_module=dill)
    

    import dill
    object = torch.load('scheduler.pth.tar', pickle_module=dill)
    

    看到了吗 documentation 保存更多选项。