如何解决在pytorch中设置随机种子后结果不固定
def setup_seed(seed):
np.random.seed(seed)
random.seed(seed)
torch.manual_seed(seed) # cpu
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = True
我在运行代码时设置了随机种子,但是用pytorch无法得到固定的结果。此外,我在代码中使用了 batchnorm 。在评估和测试时,我设置了 model.eval()。我不知道原因。
解决方法
我认为引起问题的行torch.backends.cudnn.benchmark = True
。它使 cudnn自动调谐器能够找到要使用的最佳算法。例如,可以使用these算法之一来实现 convolution :
CUDNN_CONVOLUTION_FWD_ALGO_GEMM,CUDNN_CONVOLUTION_FWD_ALGO_FFT,CUDNN_CONVOLUTION_FWD_ALGO_FFT_TILING,CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_GEMM,CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM,CUDNN_CONVOLUTION_FWD_ALGO_DIRECT,CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD,CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD_NONFUSED,
有几种没有可重复性保证的算法。
因此,对于确定性输出,请使用torch.backends.cudnn.benchmark = False
(这可能会降低执行时间)。
还有一些无法确定的pytorch函数,请参考this文档。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。