这二者的功能是不同的:
-
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()
的作用是节省存储空间。
明白的铁铁把明白打在公屏上