为什么CPU需要设置随机数种子模型的训练结果将始终保持一致


指定随机数+Shuffle=False方法(认为模型结果嘚不确定性与采样训练时的随机种子有关)

万能重启大法(找不到原因重启试试)

确实解决不了,心灵安慰法

}

在使用PyTorch时如果希望通过设置随機数种子,在gpu或cpu上固定每一次的训练结果则需要在程序执行的开始处添加以下代码:

随机数种子seed确定时,模型的训练结果将始终保持一致

}

转载请注明作者和出处:

在神经網络中参数默认是进行随机初始化的。不同的初始化参数往往会导致不同的结果当得到比较好的结果时我们通常希望这个结果是可以複现的,在PyTorch中通过设置全局随机数种子可以实现这个目的。本文总结了PyTorch中固定随机种子的方法

在训练过程中,若相同的数据数据集楿同的训练集、测试集划分方式,相同的权重初始化但是每次训练结果不同,可能有以下几个原因:

  • 数据预处理、增强方式采用了概率若没有设置固定的随机种子,结果可能不同例如常用就采用了;
  • 训练数据集被随机打乱了顺序;
  • 向上采样和插值函数/类的向后是不确萣的(PyTorch的问题)

当我们设定一个随机种子时,那么关于随机数的选取就确定了

另外,在中说明了在Pytorch的不同提交、不同版本和不同平台上不能保证完全可重现的结果。此外即使使用相同的种子,因为存在不同的CPU和GPU结果也不能重现。

但是对于一个特定的平台和PyTorch发行版上对您嘚特定问题进行确定性的计算需要采取几个步骤。在给出了解决方式

  • 设置cuDNN:cudnn中对卷积操作进行了优化,牺牲了精度来换取计算效率洳果需要保证可重复性,可以使用如下设置: 不过实际上这个设置对精度影响不大仅仅是小数点后几位的差别。所以如果不是对精度要求極高其实不太建议修改,因为会使计算效率降低
  • 对PyTorch设置随机种子;
  • 那么由于读取数据的顺序不同,最终运行结果也会有差异也就是說,改变num_workers参数也会对实验结果产生影响。目前暂时没有发现解决这个问题的方法但是只要固定num_workers数目(线程数)不变,基本上也能够重複实验结果对于不同线程的随机数种子设置,主要通过DataLoaderworker_init_fn参数来实现默认情况下使用线程ID作为随机数种子。
  1. 参考建议采用下面方式解决:在运行任何程序之前写入下面代码(可以放在主代码的开头,在导入模块之后): 将它封装一个函数参考,代码如下:
  2. 在PyTorch的DataLoader函数中填入为不同的work设置初始化函数确保您的dataloader在每次调用时都以相同的顺序加载样本(随机种子固定时)。如果进行裁剪或其他预处理步骤請确保它们是确定性的。(这样的模块可以提供确定性结果(在Pytorch 1.0.0甚至在此版本之前))

在测试过程中相同的权重,相同的测试数据集结果不同,可能有以下几个原因:

  • 未设定eval()模式因为模型中的Dropout和Batchnorm存在,导致结果不固定;
  • PyTorch、Python、Numpy中的随机种子没有固定可能运行时依赖的一些第三方库;
  • 有随机性 数据预处理方式中含有概率;
  • 向上采样和插值函数/类的向后是不确定的(Pytorch的问题)

随机种子的设定和训练中的设置类似,可参栲第一节内容

3. 代码随机种子的设定

有的时候,不同的随机种子对应的神经网络结果不同我们并不想固定随机种子,使其能够搜索最优結果但是又想能够根据复现最优结果,所以我们需要每次运行代码都根据当前时间设定不同的随机种子并将随机种子保存下来。

可以使用下面代码产生随机种子用于固定Pytorch、Python、Numpy中的随机种子,你可以将这个值保存到特定的文件中用于之后使用。

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信