项目场景:

机器学习和深度学习中,为了程序的可复现性,需要设置随机数种子。在跑多个模型时,由于数据的预处理不同,数据集进行划分时重复使用torch.utils.data.random_split,需要注意的问题

问题描述:

由于我这里使用的torch是1.5.0版本,torch.utils.data.random_split函数没有generator的参数设置种子,因此需要在代码前加入

#  Fix Seed
torch.manual_seed(0)  # 为CPU设置种子用于生成随机数,以使得结果是确定的

但是单独跑各个模型和循环跑所有模型的时候,得到的结果不一样

原因分析:

经过一步步调试发现,循环跑所有模型的时候,每次运行到torch.utils.data.random_split函数时,得到的训练集和测试集的indice列表和单独跑模型的时候不同

解决方案:

循环跑模型时,是将设置随机数种子这句话放在了循环外,而设置随机数种子只影响第一个torch.utils.data.random_split函数,因此后面再进入循环,设置随机数种子没有作用了。
numpy设置随机数种子也是同样的道理,下面举两个例子:
只设置一个随机数种子

import numpy as np
np.random.seed(0)
m = np.random.randint(10)
print(m)    # 5
m = np.random.randint(10)
print(m)    # 0
m = np.random.randint(10)
print(m)    # 3

每次random前都设置随机数种子

import numpy as npnp.random.seed(0)
m = np.random.randint(10)
print(m)    # 5np.random.seed(0)
m = np.random.randint(10)
print(m)    # 5np.random.seed(0)
m = np.random.randint(10)
print(m)    # 5

总结:

在有numpy.random和torch random的地方,设置随机数种子要注意对后续程序的作用域问题

  • 随机数种子设置在循环外,每次循环的结果不一样,但可以保证每次程序运行得到的结果一样(对应上面只设置一个循环种子的示例),对运行得到的所有结果取平均,这样使用更合理,同时也保证了结果的可复现性。
  • 随机数种子设置在循环内,每次循环的结果都一致(不过从结果的可信性来说这样是不推荐的,应该采取上面的方法取所有循环结果的平均值,这样更能反应模型的平均水平);

而随机划分数据集时,如果要保证每次运行程序划分的结果一致,torch.utils.data.random_split前需要单独设置torch.manual_seed(*)。

随机数种子的作用域问题相关推荐

  1. TENSORFLOW变量作用域(VARIABLE SCOPE)

    举例说明 TensorFlow中的变量一般就是模型的参数.当模型复杂的时候共享变量会无比复杂. 官网给了一个case,当创建两层卷积的过滤器时,每输入一次图片就会创建一次过滤器对应的变量,但是我们希望 ...

  2. [JS] undefined、null、ReferenceError的区别、变量作用域问题

    undefined.null.ReferenceError的区别 null表示"没有对象",即该处不应该有值. 典型用法是: (1) 作为函数的参数,表示该函数的参数不是对象. ( ...

  3. JS中的作用域(一)-详谈

    本篇文章在于详细解读JavaScript的作用域,从底层原理来解释一些常见的问题,例如变量提升.隐式创建变量等问题,在和大家一起交流进步的同时,也算对自己知识掌握的记录,方便以后复习 首先,直接捡干的 ...

  4. C++ 笔记(06)— 变量作用域(局部变量、全局变量、静态局部变量)

    作用域是程序的一个区域,一般来说有三个地方可以定义变量: 在函数或一个代码块内部声明的变量,称为局部变量: 在函数参数的定义中声明的变量,称为形式参数: 在所有函数外部声明的变量,称为全局变量: 1. ...

  5. Go 学习笔记(6)— 变量定义、变量声明、变量作用域

    1. 变量定义 Go 语言变量名由字母.数字.下划线组成,其中首个字符不能为数字.声明变量的一般形式是使用 var 关键字: var varName dataType [= value] Go 语言和 ...

  6. 【Spring】bean的作用域(@Scope) - singleton、prototype

    已知spring 3+已拥有多种不同的作用域: singleton(默认).prototype.request.session.global session.(参考: spring中scope作用域( ...

  7. 160630、五句话搞定JavaScript作用域

    JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕.   一."JavaScript中无块级作用域" ...

  8. 词法作用域和动态作用域

    JavaScript采用的是词法作用域 1.词法作用域 即函数定义时,即确定的作用域.js中的作用域链,在函数声明时候,就已经确定了,无论函数在何处调用,其作用域变量的查找都是按照定义是包含关系去查找 ...

  9. javascript变量声明 及作用域

    javascript变量声明提升(hoisting) http://openwares.net/js/javascript_declaration_hoisting.html 可能要FQ一下 java ...

最新文章

  1. BZOJ 2333 【SCOI2011】 棘手的操作
  2. 66319d电源使用说明书_电热水壶怎么使用?电热水壶烧不开水的问题是什么?
  3. python 绘制二维曲面_用python绘制曲面[复制]
  4. 【译】Tim Rose 的kibana插件教程-自定义App插件
  5. SearchView去除下划线
  6. ubuntu16.04安装red5
  7. MLP算法,也叫前馈神经网络或多层感知器
  8. 程序员职业发展路线图
  9. 艺术创作六步法则、浅谈色彩、如何理解漫画
  10. 让生活服务“说到做到”,美团语音应用平台的底气在哪里?
  11. java一个中文几个字节_一个汉字占几个字节你真的记住了吗?
  12. iphone申请AppleID后无法登陆App Store
  13. 这不是一篇技术型的文章,而是一篇能让你在IT世界中畅游的方法
  14. msm8996平台的 camera 框架笔记
  15. Person Search
  16. LWIP之DNS域名解析(二)
  17. Android 语音输入API使用
  18. CSS实用技巧第一讲:文字处理
  19. 大数据杀熟 算法_大数据杀熟如何防范?
  20. 写网站没有模板?这几个可以下载模板的网站,非常惊艳

热门文章

  1. Elasticsearch杂记(1)
  2. 浅谈工作中如何规避思维定式
  3. 鸿蒙密室逃脱思考的囚徒,“囚徒困境”的思考
  4. 没人能拒绝可爱的鲨鱼
  5. java输出语句没有输出,JAVA语句输出问题
  6. XFF头注入原理分析
  7. 大闻桌面 v0.08
  8. atrix 4g linux,这货还是手机?摩托神器Atrix 4G试玩图赏
  9. 双十一脱单进行时,珍爱网掀起“云相亲”浪潮
  10. 22 个出口节点对 Tor 网络发动中间人攻击