我们在训练过程中设置model.train(),但在我的训练迭代中,我也想对训练数据集进行一次前向传递,以查看新的损失值。在这样做的时候,我应该临时设置model.eval()吗?
回答:
如果你的网络在推理过程中有不同的行为(例如torch.nn.BatchNormNd
和torch.nn.DropoutNd
,对于后者,所有神经元都会被使用但会根据保留神经元的概率进行缩放,详见这里或这里)并且你想测试你的网络当前的表现(通常称为validation
步骤),那么使用module.eval()
是必须的。
在进行类似推理的操作时,始终切换到eval
模式是一种常见且非常好的做法,无论这是否会改变你的实际模型。
编辑:
在推理过程中,你还应该使用with torch.no_grad():
代码块,参见官方教程代码,因为在这一阶段不需要梯度,计算它们是浪费的。