我试图在训练期间只为那些损失小于前一批获得的损失的批次更新模型的权重。
因此,在批处理循环中,我存储了每次迭代获得的损失,然后我尝试评估一个条件:如果时间 t-1 的损失小于时间 t,那么我继续如下:
if loss[t-1] <= loss[t]:
loss.backward()
optimizer.step()
else:
#do nothing or what ?
然后,在 else 部分什么都不应该做。尽管如此,我收到一条错误消息,说 CUDA 内存不足。
当然,在计算损失之前,我执行了一个 optimizer.zero_grad() 语句。
批量运行的 for 循环似乎运行良好,但内存使用量激增。我读到也许将梯度设置为 None 会阻止权重更新过程,但我尝试了很多句子(output.clone().detach()
也optimizer.zero_grad(set_to_none=True)
)但我不确定它们是否有效。我认为他们没有。尽管如此,内存使用爆炸仍然发生。
有没有办法做到这一点?