os.environ()和yolov7里面随机种子设定
一、os.environ()介绍:
在 python 中通过 os.environ 可以获取有关系统的各种信息。
通过 os.environ 获取环境变量,什么是环境变量呢?环境变量是程序和操作系统之间的通信方式。有些字符不宜明文写进代码里,比如数据库密码,个人账户密码,如果写进自己本机的环境变量里,程序用的时候通过 os.environ.get() 取出来就行了。
os.environ 是一个字典,是环境变量的字典。“HOME” 是这个字典里的一个键,如果有这个键,返回对应的值,如果没有,则返回 none(注意 os.environ 的类型并不是 <class ‘dict’>,所以字典一些类函数不能用)
1.linux常用的key字段:
os.environ['USER']:当前使用用户。
os.environ['LC_COLLATE']:路径扩展的结果排序时的字母顺序。
os.environ['SHELL']:使用shell的类型。
os.environ['LAN']:使用的语言。
os.environ['SSH_AUTH_SOCK']:ssh的执行路径。
2.os.environ.get() 用法
os.environ 是一个字典,是环境变量的字典,可以通过 get 方法获取键对应的值(注意 os.environ 的类型并不是 <class ‘dict’>,不是所有字典的函数都能用)
os.environ.get() 是 python中os模块获取环境变量的一个方法,如果有这个键,返回对应的值,如果没有,则返回 none
也可以设置默认值,当键存在时返回对应的值,不存在时,返回默认值,这样就不会返回none。
import os
print(os.environ.get("HOME"))
print(os.environ.get("HOME", "default")) #环境变量HOME不存在,返回 default
3.环境变量用法总结–设置、修改、获取、删除、判断
# 设置
os.environ['环境变量名称']='环境变量值' #其中key和value均为string类型
os.putenv('环境变量名称', '环境变量值')
os.environ.setdefault('环境变量名称', '环境变量值')
# 修改
os.environ['环境变量名称']='新环境变量值'
# 获取
os.environ['环境变量名称']
os.getenv('环境变量名称')
os.environ.get('环境变量名称', '默认值') #默认值可给可不给,环境变量不存在返回默认值
# 删除
del os.environ['环境变量名称']
del(os.environ['环境变量名称'])
# 判断
'环境变量值' in os.environ # 存在返回 True,不存在返回 False
参考链接:https://blog.csdn.net/qq_42251157/article/details/124611547
二、随机种子设定
yolov7算法随机种子设定。首先,为了代码的可复现性,要设定随机种子,让每次代码跑出来的结果一样。其次,每个worker(一个子线程)之间要保证其多样性。
def init_torch_seeds(seed=0):torch.manual_seed(seed)if seed == 0: # slower, more reproduciblecudnn.benchmark, cudnn.deterministic = False, Trueelse: # faster, less reproduciblecudnn.benchmark, cudnn.deterministic = True, Falsedef init_seeds(seed=0):# Initialize random number generator (RNG) seedsrandom.seed(seed)np.random.seed(seed)init_torch_seeds(seed)init_seeds(2 + rank)
上面yolov7的seed=1,因为rank=-1。
python和numpy随机种子设定:(这个对torch下是没有作用的)
random.seed(seed)
np.random.seed(seed)
cpu和gpu随机种子设定:
torch.manual_seed(seed) # 为cpu设置随机种子
torch.cuda.manual_seed(seed) # 为当前GPU设置随机种子
torch.cuda.manual_seed_all(seed) # 为所有GPU设置随机种子
后面还有除了cuda的随机种子还有卷积运算算法一致:
torch.backends.cudnn.benchmark=True或者False
torch.backends.cudnn.deterministic = True或者False
下面是我摘抄某位博主的东西,同时用在底部给出了链接。’他是针对python和numpy设置随机种子的案例。
还有就是,我们得看函数在哪里被调用,如果是在类初始化的时候调用的函数,则不同实例,只要是设置的随机种子相同,产生的随机数也相同,如下代码所示:
class test(nn.Module):
def __init__(self, seed, rank):
super(test, self).__init__()
random.seed(seed)
np.random.seed(seed)
self.rank = rank
self.get()
def get(self):
for _ in range(5):
print(self.rank, np.random.randint(0, 5))
def main():
test_1 = test(0, 0)
test_2 = test(0, 1)
if __name__ == '__main__':
main()
上述代码运行的结果是:
可以看出,两个实例随机出来的随机数相同。下面所有的例子都是每个实例随机数不一样,但是每次运行的结果一样。
如果产生随机数的get函数是从外部调用的,改成如下的代码:
class test(nn.Module):
def __init__(self, seed, rank):
super(test, self).__init__()
random.seed(seed)
np.random.seed(seed)
self.rank = rank
def get(self):
for _ in range(5):
print(self.rank, np.random.randint(0, 5))
def main():
test_1 = test(0, 0)
test_2 = test(0, 1)
test_1.get()
test_2.get()
就算是把get函数的调用顺序改变,改成:
def main():
test_1 = test(0, 0)
test_2 = test(0, 1)
test_2.get()
test_1.get()
产生的随机数也不会变:
如果我把main函数中加入了全局的随机种子,其他不变:
def main():
random.seed(4)
np.random.seed(4)
test_1 = test(0, 0)
test_2 = test(0, 1)
test_1.get()
test_2.get()
结果仍然不变:
可以看出,类中产生的随机数,是每个类的随机种子所决定的。如果去除类初始化中的随机种子,改为在主函数中定义随机种子,如下:
class test(nn.Module):
def __init__(self, seed, rank):
super(test, self).__init__()
self.rank = rank
def get(self):
for _ in range(5):
print(self.rank, np.random.randint(0, 5))
def main():
random.seed(4)
np.random.seed(4)
test_1 = test(0, 0)
test_2 = test(0, 1)
test_1.get()
test_2.get()
结果仍然不变。
结果如下:
原文链接:https://blog.csdn.net/qq_39004117/article/details/99193529
除了要固定cuda的随机种子,这里还需要用到torch.backends.cudnn.deterministic和torch.backends.cudnn.benchmark确保调度的卷积算法一致
1.torch.backends.cudnn.benchmark
如果设置为True,可能无法保证结果可以复现。
torch.backends.cudnn.benchmark=True 将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法,进而实现网络的加速。适用场景是网络结构固定(不是动态变化的),网络的输入形状(包括 batch size,图片大小,输入的通道)是不变的,其实也就是一般情况下都比较适用。反之,如果卷积层的设置一直变化,将会导致程序不停地做优化,反而会耗费更多的时间。(不需要复现结果、想尽可能提升网络性能可以这样设置)。
2.torch.backends.cudnn.deterministic
torch.backends.cudnn.deterministic=True每次返回的卷积算法将是确定的,即默认算法。
如果配合上设置 Torch 的随机种子为固定值的话,应该可以保证每次运行网络的时候相同输入的输出是固定的。
保持可复现性:
import numpy as np
np.random.seed(0)
torch.manual_seed(0)
torch.cuda.manual_seed_all(0)torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True
虽然通过torch.backends.cudnn.benchmark = False限制了算法的选择这种不确定性,但是由于,算法本身也具有不确定性,因此可以通过设置:
torch.backends.cudnn.deterministic = True
原文链接:https://blog.csdn.net/M_arshal_/article/details/120932479
os.environ()和yolov7里面随机种子设定相关推荐
- Pytorch架构随机种子设定
文章目录 前言 一.CPU训练模型的随机种子设定 二.GPU训练模型的随机种子设定 前言 在利用pytorch架构构建神经网络时,常常需要随机初始化权重(weight)和偏置(bias)等参数,为了保 ...
- python怎么设置随机数种子_python实验随机种子的设置
问题: 深度学习中,训练模型时实验参数设置但结果不同(部分论文最优结果无法复现) 实验参数包括: 数据集,train/test划分,权重初始化等 可能的原因:Dropout的存在 python.num ...
- python随机密码生成以整数17为随机数种子_简述pythonpytorch 随机种子的实现
随机数广泛应用在科学研究, 但是计算机无法产生真正的随机数, 一般成为伪随机数. 它的产生过程: 给定一个随机种子(一个正整数), 根据随机算法和种子产生随机序列. 给定相同的随机种子, 计算机产生的 ...
- python中随机种子_Pytorch随机种子
最近在做比赛的时候,遇到了一个最好结果,但是之后无论怎样都复现不出来最好结果了.猜测是不是跟Pytorch中的随机种子有关. 训练过程 在训练过程中,若相同的数据数据集,相同的训练集.测试集划分方式, ...
- Pytorch固定随机种子复现模型
官网 Reproducibility - PyTorch 1.11.0 documentation 在神经网络中,参数默认是进行随机初始化的.不同的初始化参数往往会导致模型的训练结果会存在一定的差异. ...
- python随机种子的作用_简述pythonpytorch 随机种子的实现
随机数广泛应用在科学研究, 但是计算机无法产生真正的随机数, 一般成为伪随机数. 它的产生过程: 给定一个随机种子(一个正整数), 根据随机算法和种子产生随机序列. 给定相同的随机种子, 计算机产生的 ...
- 设置随机种子之后,网络训练结果仍然不同的解决方法(针对随机采样的数据集)torch设置随机种子,num_worker对数据采样的影响。
网络训练结果无法复现 设置随机种子 应该为torch, numpy,以及Python设置随机种子,并提高torch卷积精度. def set_seed(seed):random.seed(seed)n ...
- pytorch随机种子无法复现
随机种子设置: random.seed(1) np.random.seed(1) torch.manual_seed(1) cudnn.deterministic = True torch.cuda. ...
- Pytorch坑——模型可复现性实现,随机种子设置
最近被pytorch的模型复现搞了一波心态,每次训练结果不一样,一开始还以为自己的网络优化有效,谁知每次训练结果是不固定的,调了很久终于让模型固定了下来,在此记录下这个坑. 针对pytorch1.7. ...
最新文章
- AAAI 2021 | 语义解析最新进展解读
- CSMA/CD--CSMA/CA
- python中json.dumps和json.loads,get和post
- 员工转正申请书_员工有了归属感 企业实现大发展!通机股份在党工共建中摸索经验...
- 2021抖音汽车生态报告
- [转载] 全本张广泰——第八回 广泰欲悬梁 老侠三救徒
- 灯珠电路图_LED灯盘的实际电路到底长啥样,LDE灯珠又怎样检测?
- 西门子300硬件升级包下载_「西门子1200PLC教程」19.S7-1200入门实例
- Ramdisk(内存盘)虚拟磁盘设置使用
- Error: Cound not create the Java Virtual Machine. Error: A fatal exception has occurred. Program wil
- ffmpeg视频裁剪
- mfc treectrl设置背景透明_微信透明头像怎么弄 专用透明头像图片更换设置教程闽南网...
- 好用的远程登录服务器工具
- Linux发行版幽灵漏洞的backport
- 排除万难,从入门到精通区块链
- [异常检测] Regularity Learning via Explicit Distribution Modeling for Skeletal Video Anomaly Detection
- ASP.NET WebForm 回传机制
- 多线程核心8-3:线程三大安全问题之发布与逸出
- 共模电感磁芯材质你知道哪几种
- 腿抖在饮食上需要注意什么?