model.eval()和with torch.no_grad()的区别

这二者的功能是不同的:

  • model.eval(): 告诉网络的所有层,你在eval模式,也就是说,像batchNorm和dropout这样的层会工作在eval模式而非training模式(如dropout层在eval模式会被关闭)。
  • with torch.no_grad(): 这行代码会关闭自动求梯度模块,因此pytorch不会为代码块中涉及到的计算分配存储单元来存储梯度,这会节省存储空间,但你也理所当然没办法backward了。

在测试时,我们当然不需要分配空间存储梯度,因此用with torch.no_grad()会一定程度上节省存储空间。如果你的网络中包含batchNorm或者dropout这样在training,eval时表现不同的层,应当使用model.eval()

另外需要注意的是,即便不使用with torch.no_grad(),在测试时也不会计算梯度,因为梯度只有在loss.backward()之后才会计算。with torch.no_grad()的作用是节省存储空间。

明白的铁铁把明白打在公屏上

上一篇:[Laravel系列] 配置mysql数据库读写分离


下一篇:PHP中可执行代码小结