一、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里面随机种子设定相关推荐

  1. Pytorch架构随机种子设定

    文章目录 前言 一.CPU训练模型的随机种子设定 二.GPU训练模型的随机种子设定 前言 在利用pytorch架构构建神经网络时,常常需要随机初始化权重(weight)和偏置(bias)等参数,为了保 ...

  2. python怎么设置随机数种子_python实验随机种子的设置

    问题: 深度学习中,训练模型时实验参数设置但结果不同(部分论文最优结果无法复现) 实验参数包括: 数据集,train/test划分,权重初始化等 可能的原因:Dropout的存在 python.num ...

  3. python随机密码生成以整数17为随机数种子_简述pythonpytorch 随机种子的实现

    随机数广泛应用在科学研究, 但是计算机无法产生真正的随机数, 一般成为伪随机数. 它的产生过程: 给定一个随机种子(一个正整数), 根据随机算法和种子产生随机序列. 给定相同的随机种子, 计算机产生的 ...

  4. python中随机种子_Pytorch随机种子

    最近在做比赛的时候,遇到了一个最好结果,但是之后无论怎样都复现不出来最好结果了.猜测是不是跟Pytorch中的随机种子有关. 训练过程 在训练过程中,若相同的数据数据集,相同的训练集.测试集划分方式, ...

  5. Pytorch固定随机种子复现模型

    官网 Reproducibility - PyTorch 1.11.0 documentation 在神经网络中,参数默认是进行随机初始化的.不同的初始化参数往往会导致模型的训练结果会存在一定的差异. ...

  6. python随机种子的作用_简述pythonpytorch 随机种子的实现

    随机数广泛应用在科学研究, 但是计算机无法产生真正的随机数, 一般成为伪随机数. 它的产生过程: 给定一个随机种子(一个正整数), 根据随机算法和种子产生随机序列. 给定相同的随机种子, 计算机产生的 ...

  7. 设置随机种子之后,网络训练结果仍然不同的解决方法(针对随机采样的数据集)torch设置随机种子,num_worker对数据采样的影响。

    网络训练结果无法复现 设置随机种子 应该为torch, numpy,以及Python设置随机种子,并提高torch卷积精度. def set_seed(seed):random.seed(seed)n ...

  8. pytorch随机种子无法复现

    随机种子设置: random.seed(1) np.random.seed(1) torch.manual_seed(1) cudnn.deterministic = True torch.cuda. ...

  9. Pytorch坑——模型可复现性实现,随机种子设置

    最近被pytorch的模型复现搞了一波心态,每次训练结果不一样,一开始还以为自己的网络优化有效,谁知每次训练结果是不固定的,调了很久终于让模型固定了下来,在此记录下这个坑. 针对pytorch1.7. ...

最新文章

  1. AAAI 2021 | 语义解析最新进展解读
  2. CSMA/CD--CSMA/CA
  3. python中json.dumps和json.loads,get和post
  4. 员工转正申请书_员工有了归属感 企业实现大发展!通机股份在党工共建中摸索经验...
  5. 2021抖音汽车生态报告
  6. [转载] 全本张广泰——第八回 广泰欲悬梁 老侠三救徒
  7. 灯珠电路图_LED灯盘的实际电路到底长啥样,LDE灯珠又怎样检测?
  8. 西门子300硬件升级包下载_「西门子1200PLC教程」19.S7-1200入门实例
  9. Ramdisk(内存盘)虚拟磁盘设置使用
  10. Error: Cound not create the Java Virtual Machine. Error: A fatal exception has occurred. Program wil
  11. ffmpeg视频裁剪
  12. mfc treectrl设置背景透明_微信透明头像怎么弄 专用透明头像图片更换设置教程闽南网...
  13. 好用的远程登录服务器工具
  14. Linux发行版幽灵漏洞的backport
  15. 排除万难,从入门到精通区块链
  16. [异常检测] Regularity Learning via Explicit Distribution Modeling for Skeletal Video Anomaly Detection
  17. ASP.NET WebForm 回传机制
  18. 多线程核心8-3:线程三大安全问题之发布与逸出
  19. 共模电感磁芯材质你知道哪几种
  20. 腿抖在饮食上需要注意什么?

热门文章

  1. 嘟嘟早教卡小程序源码/带后台API管理系统源码
  2. 7-4 币值转换 (20分)
  3. 视频剪辑软件比较实用的有哪些
  4. Android绘制饼状图
  5. java饼状图_使用Vue+echars+Java后端数据生成饼状图
  6. Opencv c++(图像处理)
  7. Hype Cycle (技术成熟度曲线)
  8. java科技论文20000字_科学小论文范文 科学小类毕业论文开题报告范文2万字
  9. 在线绘制流程图工具gliffy
  10. WebStorm设置前端开发代码规范