model.train() : 使得droupout 层起作用, 前相传播的时候会更新means 和var,而且会自动计算梯度
model.eval(): 会使得droupout 和前向传播的时候, droupout 不起作用, means 和var这样的统计数据值不会更新,但是依然会计算梯度。
with torch.no_grad() :则代表着不会计算梯度了,节省计算量。
因此在测试阶段,应该model.eval()和 with torch.no_grad() 同时使用。
在每个测试的mini_batch中使用with torch.no_grad():
with torch.no_grad():
for data in dataloader:
imgs, labels = data
imgs = imgs.cuda()
temp_features = model(imgs)[0]