Ошибка выполнения в обратном направлении при использовании промежуточной переменной

#python #pytorch #autograd

Вопрос:

У меня есть большая промежуточная переменная, и я выделил память перед выполнением оптимизации. Но ошибка времени выполнения происходит во вторую эпоху. Когда я переместил распределение переменных в итерацию, ошибка исчезла, но она будет выделять большую память каждую эпоху (я думал, что этот процесс займет много времени). Может ли кто-нибудь объяснить, почему происходит ошибка времени выполнения и как я могу ее избежать? Могу ли я сэкономить время, заранее выделив большую промежуточную переменную?

 var1 = torch.rand(128, 128, requires_grad=True)
m1 = var1.new_empty((4, *var1.shape)) # intermediate variable
a = torch.linspace(1, 10, 4).reshape(4, 1, 1)

for i in range(10):
    #m1 = var1.new_empty((4, *var1.shape)) # No error if this line is uncommented
    m1[:] = torch.exp(var1[None, :] * 2)
    l = loss(m1, data)
    l.backward()
    with torch.no_grad():
        var1 -= var1.grad * 0.1
        var1.grad.zero_()

#RuntimeError: Trying to backward through the graph a second time, but the saved intermediate results #have already been freed. Specify retain_graph=True when calling .backward() or autograd.grad() the #first time.