numpy库中的方法参数seed和tensorflow中的seed对比

无论是前者还是后者,seed参数都是用来标识唯一的伪随机生成操作的。但是在使用过程中二者有一些区别。

在numpy中,numpy.random.seed(seed=None)的seed默认值为None,也就是说不设置的话每次相同的方法产生的结果都是不同的。比如说:

import numpy as np
print(np.random.uniform(1,10,(1,6)))
print(np.random.uniform(1,10,(1,6)))

结果:
[[ 8.88750237  9.05145997  1.7653979   1.35149305  2.52847378  8.90328253]]
[[ 1.8851215   4.78996863  9.62100577  5.79848756  7.22689403  3.83964068]]

在设置了numpy.random.seed之后,再来看看是什么结果?

import numpy as np
np.random.seed(5)
print(np.random.uniform(1,10,(1,6)))
结果:
[[ 2.99793854  8.83659076  2.8604724   9.26749817  5.3957007   6.50569477]]
print(np.random.uniform(1,10,(1,6)))
结果:
[[ 7.89317071  5.66576189  3.67120451  2.68949106  1.72667142  7.64596267]]

你是不是以为结果应该一样?但是很不幸,这个的运行结果最后跟你像的不太一样。原因是什么?再来看下后面的这段代码

import numpy as np
np.random.seed(5)
print(np.random.uniform(1,10,(1,6)))
结果
[[ 2.99793854  8.83659076  2.8604724   9.26749817  5.3957007   6.50569477]]
np.random.seed(5)
print(np.random.uniform(1,10,(1,6)))
结果:
[[ 2.99793854  8.83659076  2.8604724   9.26749817  5.3957007   6.50569477]]
np.random.seed(5)
print(np.random.uniform(1,10,(1,8)))
结果
[[ 2.99793854  8.83659076  2.8604724   9.26749817  5.3957007   6.50569477
   7.89317071  5.66576189]]

可以看出在numpy中seed的设置并不是全局的,也即单步设置。一个随机操作,对应设置一次seed;若随机操作之前没有设置seed则默认seed是为None的。只有两个相同的随机操作(方法、方法核心参数相同)都设置了相同的种子,它们产生的伪随机序列才是相同的,如上例中的第一次和第二次产生的结果。第三次操作的种子、核心参数同前两次,唯一不同的是第三次取伪随机序列中的前8个,可以看出这次结果中的前六个是和前两次产生的结果一样的。也即形状参数对序列产生无影响。

但是,对于tensorflow中的seed有两种:图级种子(graph_level seed)和操作级种子(op_level seed,这种seed的设置是在具体的操作中进行设置的)

一旦设置了图级种子(通过tf.set_random_seed(seed_value)设置),在不同的session中相同的操作总是产生相同的随机数序列

若两者都没设置,在不同的session中总是产生不同的随机数序列

若只设置了操作级种子,那么该操作在不同的session中会产生相同的随机数序列。

具体效果可参见tensorflow官网的tf.set_random_seed方法https://www.tensorflow.org/api_docs/python/tf/set_random_seed

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值