假设有一个dropout网络net,训练过程中用测试集进行了测试,接着将该网络进行了保存
torch.save(net.state_dict(), path)
然后将保存的网络加载出来:
net=class_net() # 先定义net的结构
net.load_state_dict(torch.load(path))
接着用同样的测试集进行测试,发现测试结果和保存时的结果不一致,这是因为dropout网络会对神经元进行随机失活,因此测试结果也会不一致。解决方法是在测试函数eval()中设置随机种子:
torch.manual_seed(42)
if self.cuda:torch.cuda.manual_seed(42)
注意一点,不能在dropout网络的训练函数/前向传播函数forward()中设置随机种子,否则每次前向传播失活的神经元都是一样的,失去了dropout的随机性。而在测试函数eval()中设置随机种子并不影响网络的训练,因为eval()函数不包含网络的训练过程。