Я пытаюсь использовать Torch.autograd.functional.jacobian для расчета градиентов параметров модели в отношении набора потерь, но он возвращает все нули. Моя функция определение следующего < /p>
def load_weights(model, names, orig_params, new_params, as_params=False):
param_shapes = [p.shape for p in model.dnn.parameters()]
start = 0
for name, p, new_p, shape in zip(names, orig_params, new_params, param_shapes):
numel = int(torch.prod(torch.tensor(shape)))
set_attr(model.dnn, name.split("."), torch.nn.Parameter(new_params[start:start + numel].view(shape)))
start += numel
def func(param_list):
load_weights(self.model, names, org_param, param_list, 1)
result = self.eq_cons(param_list)
result.requires_grad_()
return result
jac_mtx = torch.autograd.functional.jacobian(func, param_list, strict=1)
< /code>
Функция eq_cons обновляет модель, используя пропущенные параметры, предсказывают результат некоторых учебных данных, вычисляет серию потерь и объединяет их в массив с формой, соответствующей конкретным данным. Когда я изменяю param_list, видно, что возвращаемое значение EQ_CONS и функцию func оба изменения. Когда я устанавливаю строгое = 1, это повышает ошибку: < /p>
RuntimeError: Output 0 of the user-provided function is independent of input 0. This is not allowed in strict mode.
< /code>
Чтобы решить эту проблему, я проверяю model.parameters () в конце функции load_weights, и я уверен, что параметры обновляются. Кроме того, я попытался разделить выход, вызовать обратно в цикл и использовал следующий код для расчета градиентов отдельно. Однако он вернул один и тот же результат для разных терминов в выходе. < /P>
for index in range(len(output)):
self.model.dnn.zero_grad()
item = output[index]
item.backward()
for p in self.model.dnn.parameters():
param_grad = p.grad.detach().data
< /code>
Я смущен этой ошибкой, потому что выходной сигнал Func изменяется при вводе, и я понятия не имею, как ее решить. Почему происходит эта ошибка? Как я могу изменить свой код для правильного вычисления якобиана?
Подробнее здесь: https://stackoverflow.com/questions/796 ... -all-zeros
Torch.autograd.functional.jacobian возвращает тензоры со всеми нулями ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему вывод torch.nn.functional.linear отличается при умножении каждой строки?
Anonymous » » в форуме Python - 0 Ответы
- 31 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Что такое ComputeType of torch.nn.functional.lineear, когда вход Float16 или Bfloat16
Anonymous » » в форуме Python - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-