如何添加随机种子保证代码每次复现的一致性?
创作时间:
作者:
@小白创作中心
如何添加随机种子保证代码每次复现的一致性?
引用
CSDN
1.
https://blog.csdn.net/weixin_51524504/article/details/137038315
在机器学习和深度学习项目中,代码的复现性是一个至关重要的问题。为了确保实验结果的一致性和可重复性,正确设置随机种子是必不可少的步骤。本文将详细介绍如何在不同场景下设置随机种子,包括程序内、系统环境变量、多线程以及PyCharm调试环境,以帮助开发者实现代码的完全复现。
如何添加随机种子保证代码每次复现的一致性?
1. 程序内设定随机种子
在main()程序中首先设定随机种子:
import random
import numpy as np
import os
import torch
def set_seed(seed=42):
# 下面两个常规设置了,用来np和random的话要设置
random.seed(seed)
np.random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed) # 禁止hash随机化
# os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8' # 在cuda 10.2及以上的版本中,需要设置以下环境变量来保证cuda的结果可复现
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed) # 多GPU训练需要设置这个
# torch.use_deterministic_algorithms(True) # 一些操作使用了原子操作,不是确定性算法,不能保证可复现,设置这个禁用原子操作,保证使用确定性算法
torch.backends.cudnn.deterministic = True # 确保每次返回的卷积算法是确定的
torch.backends.cudnn.enabled = False # 禁用cudnn使用非确定性算法
torch.backends.cudnn.benchmark = False # 与上面一条代码配套使用,True的话会自动寻找最适合当前配置的高效算法,来达到优化运行效率的问题。False保证实验结果可复现。
def main():
# 设定随机种子
set_seed(42) # 设定随机种子
重要提示: 在开始Python脚本之前设置环境变量是很重要的。如果你在脚本中设置了PYTHONHASHSEED,那么它只能影响当前脚本运行的子进程,而不会影响当前脚本的hash行为。
2. 系统的环境变量设定随机种子
Windows
- 右击“计算机”或“我的电脑”图标,选择“属性”。
- 在弹出的系统属性窗口中,点击左侧的“高级系统设置”。
- 在系统属性对话框中,点击下方的“环境变量”按钮。
- 在环境变量窗口中,你可以选择添加一个新的用户变量,或者系统变量(取决于你想要这个变量是对当前用户有效还是对所有用户有效)。
- 点击“新建”来添加一个新的变量。
- 在变量名字段中输入
PYTHONHASHSEED。 - 在变量值字段中输入
42。 - 点击“确定”来保存新的环境变量。
- 重启你的计算机,或者重新打开命令提示符窗口,以使变量更改生效。
Linux
对于Linux系统,你可以通过修改用户的 .bashrc 文件或全局的 profile 文件来设置环境变量。以下是具体步骤:
- 打开终端。
- 输入以下命令之一来编辑相应的文件:
- 对于当前用户的
.bashrc文件:vim ~/.bashrc - 或者,对于所有用户的全局环境变量,编辑
/etc/profile或.bash_profile文件(取决于你的Linux发行版):
或者sudo vim /etc/profilevim ~/.bash_profile
- 在打开的文件中,添加以下行:
export PYTHONHASHSEED=42 - 保存并退出编辑器。
- 为了使更改生效,你需要重新加载配置文件,可以通过以下命令之一来完成:
- 如果你编辑的是
.bashrc:source ~/.bashrc - 如果你编辑的是
/etc/profile或.bash_profile:
或者source /etc/profile
或者,你可以简单地关闭并重新打开终端窗口。source ~/.bash_profile
通过以上步骤,你就可以在Windows和Linux操作系统中设置环境变量 PYTHONHASHSEED 的值为42了。这个变量通常用于控制Python哈希函数的随机种子,以便在不同的运行中保证哈希的一致性。
3. 程序的多线程设定随机种子
- Dataloader设定随机种子
import torch
from torch.utils import data
def seed_worker(worker_id):
worker_seed = torch.initial_seed() % 2**32
np.random.seed(worker_seed)
random.seed(worker_seed)
dataloader = data.DataLoader(
dataset=xxx,
batch_size=xxx,
shuffle=xxx,
# 关键是下面这两个,上面自己随便设置
worker_init_fn=seed_worker,
num_workers=0,
)
- 遇到某些程序可能存在多线程的情况,还需要设置为单线程:
from gensim.models import Word2Vec
# workers=1 设置为单线程
w2v = Word2Vec(sentences, size=emb_dim, min_count=1, seed=seed, workers=1)
4. PyCharm 调试设置环境变量中的随机种子
- 如果在PyCharm中调试,请设置PyCharm中的环境变量:
python PYTHONHASHSEED=42
参考文献
Pytorch坑——模型可复现性实现,随机种子设置-Hilbob-CSDN
热门推荐
如何识别帕金森疾病?
糖尿病与南瓜:安全享用的秘诀
刷单诈骗套路深,提高警惕别掉坑!
济南市天桥区:提升城市设计品质,用活历史文化遗产
798天的等待!41岁阿尔维斯洗脱罪名:无罪释放,重获自由
三角骨撕脱性骨折的治疗方式
春季嗓子干燥别忽视!3大原因及解决技巧,轻松缓解不适
日文名生成器:原理、使用方法及注意事项
大洗牌!2024年超30家千亿房企消失,央国企逆袭
叶酸片正确吃法,叶酸片服用方法科普,吃的时间、剂量均有讲究
传统复合弓制作详细过程
84版《神雕》,35岁潘迎紫饰演的小龙女不比李若彤差
香樟树种子的种植方法,这样做能让发芽率更高
苏州废旧金属回收制造的绿色转型之路,企业探索与实践案例分享
Steam游戏评测 第240期《死亡岛2》
如何操作卡丁车?卡丁车的驾驶技巧和安全须知有哪些?
期货市场中的备兑期权:概念、策略与风险管理
专家详解转基因食品:安全有保障,全球应用广泛
特别国债发行对流动性的影响研究
画眉毛用眉笔好还是眉粉好
文献解析|推动小麦精准设计育种!程时锋团队解析全球百年种质多样性
脊髓腰段——膝跳反射的神经中枢
李宗盛花了十年写的《山丘》并不是一首简单的歌
什么是球阀?球阀的应用及原理
为何医生总是劝告:胃不好的人,一定要心情好?本文说出背后原因
去了10次武汉东湖樱花园才总结出的赏樱秘籍
改善便秘,从饮食开始!
2024年十大妖股名单一览
全国眼科大咖齐聚南科大医院 探讨先天性眼球震颤治疗新思路
急性髓系白血病的常见病因