Я пытаюсь оптимизировать комбинацию двух обученных моделей, используя обучаемые коэффициенты, чтобы сделать комбинацию.
Для этого я использую две переменные nn.Parameter:
self.linwA = nn.Parameter(abs(torch.randn(1)),requires_grad=True)
self.linwB = nn.Parameter(abs(torch.randn(1)),requires_grad=True)
И я пытаюсь умножить две загруженные модели на эти параметры (по одному для каждой). Я только хочу обучить эти два параметра, поэтому только у них есть «require_grad = True», все остальное установлено в false.
Однако, единственный способ, которым я нашел это, - это умножить коэффициент на каждое значение в state_dict (), вот так:
for k, v in modelA.state_dict().items():
modelA.state_dict()[k][:] = linwA.expand_as(v)*modelA.state_dict()[k][:]
А потом я добавляю две модели. Это работает для вывода, результирующая модель является комбинацией двух, но когда я хочу использовать это для обучения параметров, функция потерь (nn.MSELoss) приводит к скалярному тензору без grad_fn, вызывая следующую ошибку: " RuntimeError: элемент 0 тензоров не требует grad и не имеет grad_fn".
Я подозреваю, что во время умножения тензоры не сохраняют параметр require_grad, но я не действительно знаю, что изменить или альтернативу ему.
Есть предложения? : /