Параметры Pytorch () ведут себя по-разному, когда собираются в список или хранятся в генераторе - PullRequest
0 голосов
/ 20 февраля 2019

TL; DR - использование генератора не удается, использование списка успешно.почему?

Я пытаюсь вручную изменить параметры моей модели следующим образом:

(1-й код, работает)

       delta = r_t + gamma * expected_reward_from_t1.data - expected_reward_from_t.data

        negative_expected_reward_from_t = -expected_reward_from_t
        self.critic_optimizer.zero_grad()
        negative_expected_reward_from_t.backward()

        for i, p in enumerate(self.critic_nn.parameters()):
             if not p.requires_grad:
                 continue
             p.grad[:] = delta.squeeze() * discount * p.grad

        self.critic_optimizer.step()

и кажется, что он сходится к правильному результату в 100% случаев.

Однако

При попытке использовать функцию, подобную этой:

(2-й код, сбой)

def _update_grads(self,delta, discount):
    params = self.critic_nn.parameters()
    for i, p in enumerate(params):
        if not p.requires_grad:
            continue
        p.grad[:] = delta.squeeze() * discount * p.grad

, а затем

       delta = r_t + gamma * expected_reward_from_t1.data - expected_reward_from_t.data

        negative_expected_reward_from_t = -expected_reward_from_t
        self.critic_optimizer.zero_grad()
        negative_expected_reward_from_t.backward()
        self._update_grads(delta=delta,
                           discount=discount)

        self.critic_optimizer.step()

, что, похоже, единственное, что я сделал, это поместил self.critic_nn.parameters() во временныйлокальная переменная params,

Теперь сеть не сходится.

(3-й код, опять же, работает)

При замене в методе _update_grads: params = self.critic_nn.parameters() на params = list(self.critic_nn.parameters())

Теперь снова сходимость восстанавливается.


Это похоже на проблему с ссылками, которая в PyTorchЯ не совсем понимаю.Кажется, я не до конца понимаю, что возвращает параметр ()


Вопрос: почему 1-й и 3-й коды работают, а 2-й не работает?

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