Я тренирую свою модель следующим образом:
for i in range(5):
optimizer.zero_grad()
y = next_input()
loss = model(y)
loss.backward()
optimizer.step()
и получаю эту ошибку
RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time.
Почему мне требуется сохранить график?Он может просто пересчитать производные, если они освобождены.Чтобы доказать это, рассмотрим код:
for i in range(5):
optimizer.zero_grad()
model.zero_grad() # drop derivatives
y = next_input()
loss = model(y)
loss.backward(retain_graph=True)
optimizer.step()
В этом случае производные от предыдущей итерации также обнуляются, но Torch это не волнует, поскольку установлен флаг retain_graph=True
.
Прав ли я, что model.zero_grad()
отменяет эффект retain_graph=True
(т.е. удаляет оставшиеся производные)?