Pytorch: объединение двух моделей (nn.Module) - PullRequest
1 голос
/ 02 марта 2020

У меня довольно сложная модель, и поэтому я не могу просто позвонить self.fc.weight et c. поэтому я хочу каким-то образом перебрать модель.

Цель состоит в том, чтобы объединить модели следующим образом: m = alpha * n + (1 - alpha) * o, где m n и o - экземпляры одного и того же класса, но обученные по-разному , Поэтому для каждого параметра в этих моделях я хочу присвоить начальные значения m на основе n и o, как описано в уравнении, а затем продолжить процедуру обучения только с m.

Я пытался:

for p1, p2, p3 in zip(m.parameters(), n.parameters(), o.parameters()):
    p1 = alpha * p2 + (1 - alpha) * p3

Но это не назначает новые значения в пределах m.

for p1, p2, p3 in zip(m.parameters(), n.parameters(), o.parameters()):
    p1.fill_(alpha * p2 + (1 - alpha) * p3)

Но это бросает

RuntimeError: листовая переменная, которая требует grad, использовалась в операции на месте.

И поэтому я прибег к рабочему

m.load_state_dict({
    k: alpha * v1 + (1 - alpha) * v2 
    for (k, v1), (_, v2) in zip(n.state_dict().items(), o.state_dict().items())
})

Есть ли лучший способ сделать это в Pytorch? Возможно ли, что я получаю ошибки градиента?

1 Ответ

3 голосов
/ 02 марта 2020

Если я вас правильно понимаю, вам нужно выйти из-под механики автограда PyTorch, что вы можете просто сделать

p1.data = alpha * p2.data+ (1 - alpha) * p3.data

Данные параметра находятся не в самом параметре, а в data участник.

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