Как сохранить планировщик LambdaLR в pytorch с лямбда-функцией? - PullRequest
0 голосов
/ 11 октября 2018

Запуск pytorch 0.4.1 с python 3.6 Я столкнулся с этой проблемой:
Я не могу torch.save мой планировщик скорости обучения, потому что python не будет выводить лямбда-функцию:

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 может бытьсохранено, но мне нужна лямбда-функция, потому что я хочу иметь возможность управлять этой функцией, когда она определена (например, я хочу иметь возможность изменить фиксированный 30 в знаменателе).
Как это можно сделать и до сих порпозволяет мне сохранить планировщик?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Если вы хотите остаться с поведением по умолчанию 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))

Теперь планировщик может быть torch.save ed и torch.load без чередования модуля травления.

0 голосов
/ 12 октября 2018

Вы можете использовать dill в качестве модуля рассола вместо рассола по умолчанию.

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

и для загрузки

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

См. документацию о сохранении для дополнительных опций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...