不管是再深度学习还是在其他工作中,相信大家经常会碰到seed()函数,一定有许多同学搞不清楚其作用,传入的参数数值(即seed(num),num对应的数字)应该是多少。下面一一给大家解答。

比较正经的定义

seed( ) 用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed( )值,则每次生成的随即数都相同

白话解释

当使用seed(num)函数,且给定同一个num值,获取一个随机数,不管执行多少次,得到的均是同一个数

import numpy as np
np.random.seed(1)
a = np.random.random()
print(a)

如执行上述代码,最终得到的结果如下(在不同的电脑上也是同样的结果,是不是很纳闷,明明取得是随机数,但是运行这段代码都会得到这个结果?甚至开始怀疑random的作用? 下面会逐步解答这一函数的妙处,以及为什么中文名叫做种子函数

0.417022004702574

当先设置一个seed(num),且传入一个给定的num值,对于给定的for序列,尝试打印出一组随机数

import numpy as np
np.random.seed(1)
for i in range(0,5):
    a=np.random.randn()
    print(a)

不管执行多少次,得到的输出均如下

1.6243453636632417
-0.6117564136500754
-0.5281717522634557
-1.0729686221561705
0.8654076293246785

改变循环迭代次数分别输出3个数和8个数

1.6243453636632417
-0.6117564136500754
-0.5281717522634557
1.6243453636632417
-0.6117564136500754
-0.5281717522634557
-1.0729686221561705
0.8654076293246785
-2.3015386968802827
1.74481176421648
-0.7612069008951028

是否发现了输出的3个数是8个数的前3个。这个操作就像有一个种子(seed()函数传入的参数),当我们得到这个种子时,不同的人使用它去获得随机数都会得到相同的结果。
也可以这样理解,在随机数这块,那些随机数每次并不是真正地随机生成,而是已经早已存在并且有对应的排列,如果我们利用seed(num)函数,且num=None(即不给一个数值),才会在这些已经给定的随机数中随机选择一个,若给定了一个num值,相当于给定了一个起始点,每次从这个起始点出发,顺着往后取值,将得到相同的数。

所以这到底有什么作用呢?

seed(num) 在一些论文代码中常见,想想,如果不同的人编写代码去初始化模型的参数,而在模型学习的过程中,主要采用一些梯度下降的方法来对模型的参数进行优化,具有一定的随机性。同时模型参数的初始值也对模型的性能有着较大的影响,初始值选取的好模型能够迅速收敛,为了减少复现原作者论文代码带来的随机性,通常会采用相同的种子编码来获得相同的初始值。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐