model.eval()和loss.backward(retain_graph = True)

1:model.eval()会固定网络的nn.BN层和nn.Dropout层,nn.BN层在train的时候针对每一个batch会计算一次均值方差,然后最后归纳整个训练集的均值方差,所以在test的时候就不能再让BN层的均值方差发生变化了。参考文章:(1条消息) Pytorch model.eval()的作用_嘿,兄弟,好久不见的博客-CSDN博客_model.eval()作用

2:loss.backward(retain_graph = True),首先,forward一次会建立一个计算图,正常backward()会释放掉forward()过程所建立的计算图。而在backward中指定retain_graph = True以后,则每次backward不会释放当次forward()产生的计算图,这样会导致内存中计算图越来越多,使得训练会越来越慢。

另外为了保证每次backward()之后,梯度不会积累,在backward之前一般会采取optmizer.zero_grad()的方法。

参考自:

为什么向后设置(retain_graph = True)会占用大量GPU内存?-python黑洞网 (pythonheidong.com)(1条消息) Pytorch中backward(retain_graph=True)的 retain_graph参数解释_今 晚 打 老 虎的博客-CSDN博客_retain_graph=true为什么向后设置(retain_graph = True)会占用大量GPU内存?-python黑洞网 (pythonheidong.com)

你可能感兴趣的:(CV笔记,深度学习,pytorch)