若只有一个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