У меня есть функция потерь и список весовых матриц, и я пытаюсь вычислить вторые производные. Вот фрагмент кода:
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 (retain_graph), я получаю ошибку A:
RuntimeError: элемент 0 переменных кортеж является изменчивым
Если я использую его, но не ставлю операторы "graph" на первую производную, я получаю ошибку B:
RuntimeError: Попытка перевернуть график во второй раз, но буферы уже освобождены. Укажите retain_graph = True при обратном вызове в первый раз.
Если я укажу retain_graph = True, я получу ошибку A для второй производной (т. Е. В циклах for), независимо от того, положу я туда оператор create graph или нет.
Следовательно, работает только приведенный выше фрагмент кода, но мне кажется странным, что мне нужен loss.backward и все операторы create graph. Может ли кто-нибудь объяснить мне это? Большое спасибо заранее !!