pytorch每次分类结果都不同,有细微差异

2022-10-23 14:17:59

看了许多大神的经验,做一个总结:

  1. 验证测试集的时候开启model.eval()
  2. 设置随机种子。
  3. pytorch框架中模型加载器dataLoader的属性“shuffle”置为“False”。

如果想看具体原因简单实现 可以继续往下看:

  1. 验证测试的时候开启model.eval()。因为可能你的模型中含有 BatchNormalization(批归一化)或 Dropout(舍弃),如果未设置模型为eval模式,则验证时会根据每次的batch调整或Dropout还是随机去掉某些神经元,这不符合我们的要求。如果设置模型为eval后,Batch会设置全部数据的均值,Dropout会全部放开,不会随机率舍弃神经元。简单代码如下:
for epochin num_epoch:
	
	model.train()....具体训练的代码....

	model.eval()....具体验证的代码....
  1. 设置随机种子。众所周知,种子会影响每次随机数的取值,而我们的程序中不可避免会用到一些随机数,可能我们自己都不知道哪里用到了。所以最好设置种子一样把。
seed=0# 设置一个种子,确保可以复现
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)# if you are using multi-GPU.
np.random.seed(seed)# Numpy module.
random.seed(seed)# Python random module.
torch.manual_seed(seed)
torch.backends.cudnn.benchmark=False
torch.backends.cudnn.deterministic=True
————————————————
版权声明:本文为CSDN博主「ASR_THU」的原创文章,遵循CC4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zongza/article/details/90908609
  1. pytorch框架中模型加载器dataLoader的属性“shuffle”置为“False”。亲身经历过这个问题。看知乎有大神提到有可能是每次测试数据不一样导致分类结果有细微差异,我才想到dataLoader。
# 我把我的一个程序中用到的dataLoader拿出来当例子

dataLoader= torch.utils.data.DataLoader(
        dataset=dataset,
        batch_size=batch_size,
        shuffle=False,# 为了能复现结果,我将shuffle设置为False
        pin_memory=pin_memory,
        num_workers=workers)

我们总是站在巨人的肩膀上。感激各位前辈和领路人的指引。

参考链接:

  1. [pytorch] 每次训练的结果都不同(无法复现)
  2. 知乎:为什么训练好的lstm模型每次输出的结果不一样?
  3. pytorch中model.train(),model.eval() 和 torch.no_grad()的区别
  • 作者:爱学习的大白菜
  • 原文链接:https://blog.csdn.net/csdnliwenqi/article/details/121130967
    更新时间:2022-10-23 14:17:59