model.eval()的作用是用于模型评估阶段,关闭模型的Batch normalization层和Dropout层,[参考]
所以在model.eval()时模型参数还是会变化的[参考],梯度的计算不受影响,计算流依然会存储和计算梯度,反向传播后仍然能够更新模型的对应的权重(比如BN层的weight和bias依然能够被更新)。
而torch.no_grad()的作用就是停止autograd模块的工作,即不会自动计算和存储梯度,因此能够起到加速计算过程和节省显存的作用,同时也说明了不能够进行反向传播以更新模型权重。
所以一般torch.no_grad()和model.eval()配合使用,即:
with torch.no_grad():
model.eval()