Pytorch Custom Optimizer получил пустой список параметров - PullRequest
0 голосов
/ 15 апреля 2020

новое здесь. Я пытаюсь создать собственный оптимизатор в PyTorch, где backprop имеет место в политике meta RL, где политика получает параметры модели и выводит нужные параметры модели. Однако я вижу вышеупомянутую ошибку. Мои модели отлично работают на Адаме и SGD, но не на моем оптимизаторе.

Код:

class MetaBackProp(torch.optim.Optimizer):
    def __init__(self, params):

        self.param_shape_list = np.array([])
        for param in list(params):
            np.append(self.param_shape_list, list(param.size()))

        pseudo_lr = 1e-4
        pseudo_defaults = dict(lr=pseudo_lr)
        length = 100 #TODO: get shape, flatten, multiply...
        self.policy = AEPolicy(length)
        self.policy_optim = torch.optim.Adam(self.policy.parameters(), lr=pseudo_lr)
        super(MetaBackProp, self).__init__(params, pseudo_defaults)

    def step(self, closure=None):
        params = torch.cat([p.view(-1) for p in self.param_groups])
        self.policy_optim.zero_grad()
        quit()

Трассировка:

Traceback (most recent call last):
  File "main.py", line 6, in <module>
    gan = CycleGAN()
  File "/home/ai/Projects_v2/R/cycle_gan.py", line 32, in __init__
    self.discriminator2_optim = MetaBackProp(self.discriminator2.parameters())
  File "/home/ai/Projects_v2/R/lr_schedule.py", line 34, in __init__
    super(MetaBackProp, self).__init__(params, pseudo_defaults)
  File "/home/ai/anaconda3/lib/python3.7/site-packages/torch/optim/optimizer.py", line 46, in __init__
    raise ValueError("optimizer got an empty parameter list")
ValueError: optimizer got an empty parameter list

1 Ответ

1 голос
/ 16 апреля 2020

Вы получаете параметры с помощью self.discriminator2.parameters(), который возвращает итератор. В вашем конструкторе вы конвертируете их в список для for l oop:

for param in list(params):

. Это потребляет итератор, но вы передаете тот же итератор конструктору базового класса, следовательно, он делает вообще не содержит никаких параметров.

super(MetaBackProp, self).__init__(params, pseudo_defaults)

Вместо прохождения итератора вы можете использовать список, созданный вами из итератора, поскольку параметры просто должны быть итерируемыми, то есть списками.

# Convert parameters to a list to allow multiple iterations
params = list(params)
for param in params:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...