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

Sha*_*hai 3 python-3.x pytorch

使用 python 3.6 运行 pytorch 0.4.1 我遇到了这个问题:
我无法使用torch.save我的学习率调度程序,因为 python 不会腌制 lambda 函数:

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

结果有错误

PicklingError: Can't pickle <function <lambda> at 0x7f7583fe92f0>:
attribute lookup <lambda> on __main__ failed
Run Code Online (Sandbox Code Playgroud)

如何保存我的调度程序?


我知道lambda1可以保存使用适当的函数而不是 lambda 函数,但是我需要一个 lambda 函数,因为我希望能够在定义此函数时对其进行控制(例如,我希望能够更改固定的 30在分母中)。
如何做到这一点并且仍然允许我保存调度程序?

Sha*_*hai 6

如果希望保留torch.saveand 的默认行为,torch.load可以将 lambda 函数替换为一个类,例如:

class LRPolicy(object):
    def __init__(self, rate=30):
        self.rate = rate

    def __call__(self, epoch):
        return epoch // self.rate
Run Code Online (Sandbox Code Playgroud)

调度程序现在

scheduler = LambdaLR(optimizer, lr_lambda=LRPolicy(rate=30))
Run Code Online (Sandbox Code Playgroud)

现在可以torch.save编辑调度程序,torch.load而无需交替酸洗模块。