若只有一个loss
outputs = model(inputs)
loss = criterrion(outputs,target)
optimizer.zero_grad()
loss.backward()
optimizer.step()
(1)计算损失;
(2)清除之前的梯度 optimizer.zero_grad()
(3)loss.backward() ,计算当前梯度,反向传播
(4)根据当前梯度更新网络参数,一个batch数据会计算一次梯度,然后optimizer.step()更新。
loss1= Loss(output[0], target)
loss1.backward()
loss2= Loss(output[1], target)
loss2.backward()
这样会报错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.
因为pytorch,一张图只允许一次backward,每次进行完之后,中间的变量就会被释放掉。
所以loss2.backward()时计算图已经没了,就没办法计算梯度了。
解决办法是loss.backward(retain_grad=True)
即暂时不释放计算图,在后续训练过程中计算图不释放,会一直累积,因此需要在最后一个loss是释放掉计算图loss.backward(),放置OOM
本文解释了在PyTorch中遇到的多损失反向传播错误,并介绍了如何通过retain_graph=True解决。讲解了为何不能直接多次调用loss.backward(),以及在何时释放计算图以避免内存溢出。
223

被折叠的 条评论
为什么被折叠?



