У меня есть функция потерь и список весовых матриц, и я пытаюсь вычислить вторые производные. Вот фрагмент кода:
loss.backward(retain_graph=True)
grad_params_w=torch.autograd.grad(loss, weight_list,create_graph=True)
for i in range(layers[a]):
for j in range (layers[a+1]):
second_der=torch.autograd.grad(grad_params_w[a][i,j], my_weight_list[b], create_graph=True)
Приведенный выше код работает (на самом деле вторая производная вызывается в отдельной функции, но я поставил ее непосредственно для краткости). Но я совершенно не понимаю, когда использовать график создания и сохранения.
Во-первых: если я не выполняю loss.backward (keep_graph), я получаю сообщение об ошибке A:
RuntimeError: элемент 0 кортежа переменных является изменчивым
Если я использую его, но не помещаю "график" в первую производную, я получаю ошибку B:
RuntimeError: попытка вернуться по графику во второй раз, но буферы уже освобождены. При обратном вызове в первый раз укажите keep_graph = True.
Если я укажу keep_graph = True, я получу ошибку A для второй производной (т.е. в циклах for) независимо от того, помещаю я туда оператор создания графа или нет.
Следовательно, работает только приведенный выше фрагмент, но мне кажется странным, что мне нужен loss.backward и весь оператор создания графа. Может ли кто-нибудь прояснить это мне? Заранее большое спасибо!!
Пожалуйста, разместите Минимальный, полный и проверяемый пример.