У меня довольно сложная модель, и поэтому я не могу просто позвонить 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? Возможно ли, что я получаю ошибки градиента?