千家信息网

PyTorch怎么设置随机数种子使结果可复现

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍了PyTorch怎么设置随机数种子使结果可复现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。由于在模型训练的过程中存在
千家信息网最后更新 2026年11月01日PyTorch怎么设置随机数种子使结果可复现

这篇文章主要介绍了PyTorch怎么设置随机数种子使结果可复现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

由于在模型训练的过程中存在大量的随机操作,使得对于同一份代码,重复运行后得到的结果不一致。因此,为了得到可重复的实验结果,我们需要对随机数生成器设置一个固定的种子。这样我们就得到了结果可复现的随机数种子。

CUDNN

cudnn中对卷积操作进行了优化,牺牲了精度来换取计算效率。如果需要保证可重复性,可以使用如下设置:

from torch.backends import cudnncudnn.benchmark = False            # if benchmark=True, deterministic will be Falsecudnn.deterministic = True

不过实际上这个设置对精度影响不大,仅仅是小数点后几位的差别。所以如果不是对精度要求极高,其实不太建议修改,因为会使计算效率降低。

Pytorch

torch.manual_seed(seed)            # 为CPU设置随机种子torch.cuda.manual_seed(seed)       # 为当前GPU设置随机种子torch.cuda.manual_seed_all(seed)   # 为所有GPU设置随机种子

Python & Numpy

如果读取数据的过程采用了随机预处理(如RandomCrop、RandomHorizontalFlip等),那么对python、numpy的随机数生成器也需要设置种子。

import randomimport numpy as nprandom.seed(seed)np.random.seed(seed)

Dataloader

如果dataloader采用了多线程(num_workers > 1), 那么由于读取数据的顺序不同,最终运行结果也会有差异。

也就是说,改变num_workers参数,也会对实验结果产生影响。

目前暂时没有发现解决这个问题的方法,但是只要固定num_workers数目(线程数)不变,基本上也能够重复实验结果。

补充:pytorch 固定随机数种子踩过的坑

1.初步固定

 def setup_seed(seed):     torch.manual_seed(seed)     torch.cuda.manual_seed_all(seed)     torch.cuda.manual_seed(seed)     np.random.seed(seed)     random.seed(seed)     torch.backends.cudnn.deterministic = True     torch.backends.cudnn.enabled = False     torch.backends.cudnn.benchmark = False     #torch.backends.cudnn.benchmark = True #for accelerating the running setup_seed(2019)

2.继续添加如下代码:

tensor_dataset = ImageList(opt.training_list,transform)def _init_fn(worker_id):     random.seed(10 + worker_id)    np.random.seed(10 + worker_id)    torch.manual_seed(10 + worker_id)    torch.cuda.manual_seed(10 + worker_id)    torch.cuda.manual_seed_all(10 + worker_id)dataloader = DataLoader(tensor_dataset,                                            batch_size=opt.batchSize,                         shuffle=True,                         num_workers=opt.workers,                    worker_init_fn=_init_fn)

3.在上面的操作之后发现加载的数据多次试验大部分一致了

但是仍然有些数据是不一致的,后来发现是pytorch版本的问题,将原先的0.3.1版本升级到1.1.0版本,问题解决

4.按照上面的操作后虽然解决了问题

但是由于将cudnn.benchmark设置为False,运行速度降低到原来的1/3,所以继续探索,最终解决方案是把第1步变为如下,同时将该部分代码尽可能放在主程序最开始的部分,例如:

import torchimport torch.nn as nnfrom torch.nn import initimport pdbimport torch.nn.parallelimport torch.nn.functional as Fimport torch.backends.cudnn as cudnnimport torch.optim as optimimport torch.utils.datafrom torch.utils.data import DataLoader, Datasetimport sysgpu_id = "3,2"os.environ["CUDA_VISIBLE_DEVICES"] = gpu_idprint('GPU: ',gpu_id)def setup_seed(seed):     torch.manual_seed(seed)     torch.cuda.manual_seed_all(seed)     torch.cuda.manual_seed(seed)     np.random.seed(seed)     random.seed(seed)     cudnn.deterministic = True     #cudnn.benchmark = False     #cudnn.enabled = Falsesetup_seed(2019)

感谢你能够认真阅读完这篇文章,希望小编分享的"PyTorch怎么设置随机数种子使结果可复现"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

种子 结果 随机数 数据 篇文章 问题 一致 代码 版本 精度 实验 运行 同时 效率 生成器 线程 过程 部分 面的 影响 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 高科技互联网 平安科技 互联网 西安互联网科技 互联网科技论文 腾讯科技 互联网女皇 猫创互联网科技 互联网科技咨询 成都玖崟互联网科技有限公司乐商圈怎么样 广州优美互联网科技 宁夏众和广鑫互联网科技有限公司 河南猎农互联网科技有限公司 阿大互联网科技有限公司 未来五年的互联网科技 速维有品互联网信息科技(苏州)有限公司 乌鲁木齐新华智原互联网科技学校 山东有哪些互联网科技公司 互联网公司高科技产品 抖集互联网科技技术咨询 上海旺乐尼互联网科技有限公司 科技发展第三阶段互联网时代 科技金融是不是互联网金融 互联网核心科技是什么 互联网科技资迅 小马过河互联网科技 互联网科技论坛 美国互联网前沿科技 成都仁贤领冠互联网科技有限公司 赶超互联网科技 微信多开 工业互联网山东科技大学 北京瑞云互联网科技有限公司
0