Вторая производная Pytorch застряла между двумя ошибками: буферы были освобождены, а переменная изменчива - PullRequest
0 голосов
/ 16 мая 2018

У меня есть функция потерь и список весовых матриц, и я пытаюсь вычислить вторые производные. Вот фрагмент кода:

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. Может ли кто-нибудь объяснить мне это? Большое спасибо заранее !!

...