numpy 随机数_TF+Numpy减少随机性的影响

有这么一个段子:

深度学习论文有一半不公开源代码,另外公开源代码的一半复现不了,鬼知道作者怎么把结果搞得这么牛逼的.

其中一个原因就是深度学习使用了大量的随机数,就我一般使用的Python+TensorFlow环境而言,Python的随机性来自于numpy,而TensorFlow在初始化参数的时候也是使用了随机数的,当我们复现时,如果随机数都不一样,那么得到的结果是否和作者相同就依赖于这个网络的鲁棒性了.

ps:个人感觉,既然大家都说深度学习是寻找局部最优而不是全局最优,那么初始点落在哪是不是找到的局部最优点也不一样,所以随机性的影响还是很大的.

先放使用代码吧,有兴趣的可以接着看:

from numpy.random import seed
seed(1)
from tensorflow import set_random_seed
set_random_seed(2)

一.Numpy

一般使用下列的指令来生成随机数

import numpy as np
print (np.random.random())

参考numpy.random.seed()的使用,因为是伪随机算法,所以这个得到的结果是不固定的,我运行了三次,得到的结果为(这个结果一般是复现不了的):

>>> print (np.random.random())
0.239562458088
>>> print (np.random.random())
0.112245171048
>>> print (np.random.random())
0.627331947322

重新开一个终端,再次运行的结果为:

>>> print (np.random.random())
0.819976925039
>>> print (np.random.random())
0.902082170272
>>> print (np.random.random())
0.856090102495

如何保证两次开启终端后得到的结果都是一直的呢,这就需要固定随机算法的种子点了,numpy.random.seed()来指定随机数生成时所用算法开始的整数值.

这个函数有这些特性:

  1. 如果使用相同的种子值,则每次生成的随机数都相同;
  2. 如果不设置种子值,则系统根据时间来自动选择种子值,此时每次生成的随机数因时间差异而不同;(我曾经因为项目需要开启了多进程,生成了N个相同函数的进程,同时生成随机数,但是无奈发现生成的随机数都相同,原因在于N个子进程都是同时生成了,我的解决方法是给每个进程传入一个参数,表示进程号,即0,1,...,N-1,以这个进程号为种子值去设置随机数,[Python标准库]random——伪随机数生成器讲了相关的一部分知识);讲了相关的一部分知识);
  3. 设置的种子值仅一次有效。

下面来验证该方法的有效性.

生成一个测试文件test.py:

import numpy as np
np.random.seed(5)
print (np.random.random())
print (np.random.random())

运行文件python test.py,得到下列结果:

0.22199317108973948
0.8707323061773764

再次运行python test.py,得到下列结果:

0.22199317108973948
0.8707323061773764

可以看到,两次的结果是一致的,说明这样使用就可以把随机数生成时的随机性都消除掉了,这样所有人的结果都是一致的.


二.TensorFlow

在TensorFlow中的设置可参考用深度学习每次得到的结果都不一样,怎么办?,这是一篇译文,原文在How to Get Reproducible Results with Keras有兴趣的可以看看.

其大概思想是:

为了在用同样的数据训练同一网络时确保得到同样的结果,需要设置随机数字生成器的种子,在TensorFlow中设置的方法是:

from tensorflow import set_random_seed
set_random_seed(2)

这里种子点参数可以设置别的整数.

在实践中,这样设置只能保证大体上能够相同,随着迭代的进行,loss等还是会有细微的差别,不过依然在可控的范围内,作者也讲了有以下的几个原因:来自第三方库的随机性,使用GPU产生的随机性,来自复杂模型的随机性.这些原因很难避免,不过实践来看,结果都在可控范围内.


三.TensorFlow源码解读

首先说明,这个会比较水,先放着等以后再加内容吧.

官方文档在set_random_seed.其解释说有两种情况:graph-level的种子和operation-level的种子.

operation-level的种子如下:

a = tf.random_uniform([1], seed=1)

需要对变量依次指定种子点,很不方便,一般我们都是全局使用的,因此需要使用graph-level的种子,如下:

tf.set_random_seed(1234)

其源代码位于random_seed.py,里面主要有两个函数,一个是getseed()函数,一个是setrandomseed()函数.set_randomseed()函数指向context.py.

里面Context类是相关的,定义了一些私有变量和函数.之外还有一些函数会引用它们.

get_seed()函数引用global_seed()函数:

def global_seed():"""Returns the eager mode seed."""return context()._seed  # pylint: disable=protected-access

直接返回私有变量_seed.

setrandomseed()函数引用set_global_seed(seed)函数:

def set_global_seed(seed):"""Sets the eager mode seed."""context()._set_global_seed(seed)  # pylint: disable=protected-access

指向context()里面的_set_global_seed(seed)函数:

def _set_global_seed(self, seed):"""Set a global eager mode seed for random ops."""self._seed = seedself._rng = random.Random(self._seed)# Also clear the kernel cache, to reset any existing seedsif self._context_handle is not None:pywrap_tensorflow.TFE_ContextClearCaches(self._context_handle)

会设置种子变量_seed,另外_rng的作用可参考_internal_operation_seed()函数:

def _internal_operation_seed(self):"""Returns a fake operation seed.In eager mode, user shouldn't set or depend on operation seed.Here, we generate a random seed based on global seed to makeoperation's randomness different and depend on the global seed.Returns:A fake operation seed based on global seed."""return self._rng.randint(0, _MAXINT32)

作用是在eager模式下,不在使用种子变量_seed,而是随机选择0到种子变量_seed之间的一个数作为种子变量,为什么要设置就不知道了.

另外,设置种子变量后在哪有应用就不知道了,留待以后解决吧.

【已完结】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode LCS 01. 下载插件

文章目录1. 题目2. 解题1. 题目 小扣打算给自己的 VS code 安装使用插件,初始状态下带宽每分钟可以完成 1 个插件的下载。 假定每分钟选择以下两种策略之一: 使用当前带宽下载插件将带宽加倍(下载插件数量随之加倍) 请返回小扣完成下载 n …

ASCII字符集中的功能/控制字符

转载:ASCII字符集中的功能/控制字符 Function/Control Code/Character in ASCII 【什么是 Function Code 功能码或 Function Character 功能字符】 ASCII 字符集,大家都知道吧,最基本的包含了 128 个字符。其中前 32 个, 0-31 ,即…

mysql chown_chown -R mysql:mysql ./及chown详解

chown -R mysql:mysql ./及chown详解,当我们在不通过yum(CentOS)、apt-get(Ubuntu)来安装MySQL的时候,通常执行以下命令来改变目录的拥有者:[rootlocalhost ~]# chown -R mysql:mysql ./那?这两个mysql谁是用户名谁是用户组呢&am…

LeetCode LCS 02. 完成一半题目(计数+排序)

文章目录1. 题目2. 解题1. 题目 有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。 主办方提供了 2*N 道题目,整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。 若每位扣友选择不同的一题,请返回被选的 N 道题目至少包含多少种…

opensip db mysql_opensip和opensip_cp安装配置

一,opensip安装1,老老实实安装各种库,我在这里吃了点亏:yum install gcc makeyum install flex bison ncurses libncurses-dev ncurses-develyum install mysql mysql-server mysql-libs mysql-devel2,下载opensip&…

摄像头图像分析目标物体大小位置_单个运动摄像头估计运动物体深度,谷歌挑战新难题...

雷锋网 AI 科技评论按:人类视觉系统有一个我们习以为然但其实极其强大的功能,那就是可以从平面图像反推出对应的三维世界的样子。即便在有多个物体同时移动的复杂环境中,人类也能够对这些物体的几何形状、深度关系做出合理的推测。然而类似的…

Spring中DispacherServlet、WebApplicationContext、ServletContext的关系

解释一: 要想很好理解这三个上下文的关系,需要先熟悉spring是怎样在web容器中启动起来的。spring的启动过程其实就是其IoC容器的启动过程,对于web程序,IoC容器启动过程即是建立上下文的过程。 spring的启动过程: 首先&…

LeetCode LCS 03. 主题空间(广度优先搜索BFS)

文章目录1. 题目2. 解题1. 题目 「以扣会友」线下活动所在场地由若干主题空间与走廊组成,场地的地图记作由一维字符串型数组 grid,字符串中仅包含 “0"~"5” 这 6 个字符。 地图上每一个字符代表面积为 1 的区域,其中 …

UIImage 裁剪图片和等比列缩放图片

本文转载至 http://blog.csdn.net/cuiweijie3/article/details/9514293 转自 http://www.tedz.me/ios/uiimage-crop-resize-image interface UIImage(UIImageScale)-(UIImage*)getSubImage:(CGRect)rect;-(UIImage*)scaleToSize:(CGSize)size;endimplementation UIImage(UIIma…

python模式匹配算法_详解Python 最短匹配模式

问题你正在试着用正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配。 而你想修改它变成查找最短的可能匹配。解决方案这个问题一般出现在需要匹配一对分隔符之间的文本的时候(比如引号包含的字符串)。 为了说明清楚,考虑如下的例子&#xf…

Paddle 基于预训练模型 ERNIE-Gram 实现语义匹配

文章目录1. 导入一些包2. 加载数据3. 数据预处理3.1 获取tokenizer,得到 input_ids, token_type_ids3.2 转换函数、batch化函数、sampler、data_loader4. 编写模型5. 学习率、参数衰减、优化器、loss、评估标准6. 评估函数7. 训练评估8. 保存模型到文件9. 预测10. 多…

j2ee和mysql怎么连接_J2EE数据库连接不再烦恼

刚开始接触j2ee的时候总是为数据库的开关连接问题而烦恼,虽然问题很简单却很是琐碎,于是干脆写成一个类将所有必要的基本操作全部总结进去,以后只要轻松的import一下就可以了啊:)菜鸟们enjoying!import java.sql.Connection;import java.sql.Statement;import java.sql.ResultS…

SQL SERVER PIVOT 行转列、列传行

在数据库操作中,有些时候我们遇到需要实现“行转列”的需求,例如一下的表为某店铺的一周收入情况表: WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIMAL) 我们先插入一些模拟数据: INSERT INTO WEEK_INCOME SELECT 星期一,1000 UNION…

python安装scipy出现红字_windows下安装numpy,scipy遇到的问题总结

1.安装numpy下载numpy编译包,进入该目录下, 调用命令 python setup.py install进行安装,返回错误:error: Unable to find vcvarsall.bat出现这个原因的问题貌似跟vc编译器有关,具体原因没有细究,但是经Goog…

mysql cluster 查看数据库表名称_MySQL Cluster如何创建磁盘表方法解读

MySQL Cluster采用一系列的Disk Data objects来实现磁盘表;接下来为您详细介绍一、概念MySQL Cluster采用一系列的Disk Data objects来实现磁盘表。Tablespaces:作用是作为其他Disk Data objects的容器。Undo log files:存储事务进行回滚需要的信息&…

(运算符) 运算符

& 运算符既可作为一元运算符也可作为二元运算符。 备注 一元 & 运算符返回操作数的地址(要求 unsafe 上下文)。 为整型和 bool 类型预定义了二进制 & 运算符。 对于整型,& 计算操作数的逻辑按位“与”。 对于 bool 操作数&am…

LeetCode 1903. 字符串中的最大奇数

文章目录1. 题目2. 解题1. 题目 给你一个字符串 num ,表示一个大整数。 请你在字符串 num 的所有 非空子字符串 中找出 值最大的奇数 ,并以字符串形式返回。如果不存在奇数,则返回一个空字符串 “” 。 子字符串 是字符串中的一个连续的字符…

python模拟qq空间登录_python selenium模拟登录163邮箱和QQ空间

最近在看python网络爬虫,于是我想自己写一个邮箱和QQ空间的自动登录的小程序,下面以登录163邮箱和QQ空间和为例:了解到在Web应用中经常会遇到frame/iframe 表单嵌套页面的应用,WebDriver 只能在一个页面上对元素识别与定位&#x…

mysql分页插件springboot_SpringBoot--使用Mybatis分页插件

1、导入分页插件包和jpa包org.springframework.bootspring-boot-starter-data-jpacom.github.pagehelperpagehelper-spring-boot-starter1.2.52、增加分页配置# 主键自增回写方法,默认值MYSQL,详细说明请看文档mapper:identity: MYSQL# 设置 insert 和 update 中,是…

top 命令详解

作用: 实时动态查看系统的整体运行情况, 是一个综合了多方信息监测系统性能和运行信息的实用工具。 选项:-b 以批处理模式操作-c 显示完整的命令-d 屏幕刷新间隔时间-I 忽略失效过程-s 保密模式-S 累积模式-i 设置时间间隔-u 指定用户…