我想看看哪个随机数生成器包在我的神经网络中更快。
我目前正在更改github的一个代码,其中两个都是numpy。随机和随机包用于生成随机整数、随机选择、随机样本等。
我之所以更改此代码,是因为出于研究目的,我希望设置一个全局种子,以便能够比较超参数不同设置的精度性能。问题是,现在我必须为随机包和numpy包设置两个全局种子。理想情况下,我只想设置一个种子,因为来自两个随机数生成器序列的图形可能会更快地关联起来。
然而,我不知道哪个软件包的性能更好(在速度方面):numpy还是random。所以我想找到两种包装的种子,它们对应于完全相同的梅森扭转序列。这样一来,两个模型的图形都是相同的,因此每个梯度下降步骤中的迭代次数也是相同的,这导致了速度上的差异,这只是由我使用的包引起的。
我找不到任何关于成对种子的文档,这些种子在两个包中都以相同的随机数序列结束,而且尝试各种组合似乎有点麻烦。
我尝试了以下方法:
np.random.seed(1)
numpy_1=np.random.randint(0,101)
numpy_2=np.random.randint(0,101)
numpy_3=np.random.randint(0,101)
numpy_4=np.random.randint(0,101)
for i in range(20000000):
random.seed(i)
random_1=random.randint(0,101)
if random_1==numpy_1:
random_2=random.randint(0,101)
if random_2==numpy_2:
random_3=random.randint(0,101)
if random_3==numpy_3:
random_4=random.randint(0,101)
if random_4==numpy_4:
break
print(np.random.randint(0,101))
print(random.randint(0,101))
但这并没有真正起作用,这是可以预料的。
重复这篇文章
答案取决于需求:
-加密/安全:秘密
-科学研究:numpy
-常用:随机
考虑以下肮脏的黑客:
import random
import numpy as np
random.seed(42)
np.random.seed(42)
print(random.random(), np.random.random())
# copy numpy random module state to python random module
a = random.getstate()
b = np.random.get_state()
a2 = (a[0], tuple(int(val) for val in list(b[1]) + [a[1][-1]]), *a[2:])
random.setstate(a2)
print(random.random(), np.random.random())
输出:
0.6394267984578837 0.3745401188473625 # different
0.9507143064099162 0.9507143064099162 # same
不确定这两种实现的所有可能性是否真的一致。
numpy。random
和pythonrandom
以不同的方式工作,尽管正如您所说,它们使用相同的算法。
在种子方面:您可以使用numpy中的
(在python中称为set_state
和get_state
函数。randomgetstate
和setstate
)并将状态从一个传递到另一个。结构略有不同(在python中,pos
integer附加到状态元组的最后一个元素)。参见numpy的文档。随机的获取_state()和random。getstate():
import random
import numpy as np
random.seed(10)
s1 = list(np.random.get_state())
s2 = list(random.getstate())
s1[1] = np.array(s2[1][:-1]).astype('int32')
s1[2] = s2[1][-1]
np.random.set_state(tuple(s1))
print(np.random.random())
print(random.random())
>> 0.5714025946899135
0.5714025946899135
就效率而言:这取决于你想做什么,但是Numpy通常更好,因为你可以创建元素数组而不需要循环:
%timeit np.random.random(10000)
142 µs ± 391 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit [random.random() for i in range(10000)]
1.48 ms ± 2.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
就“随机性”而言,numpy(根据他们的文档)也更好:
注意:Python stdlib模块“random”还包含一个Mersenne Twister伪随机数生成器,其中有许多方法与RandomState
中提供的html" target="_blank">方法类似RandomState
除了具有NumPy意识之外,还有一个优点,即它提供了更多的概率分布供选择。
问题内容: Tensorflow中是否有等效于numpy随机选择的函数。在numpy中,我们可以从给定列表中随机获得一个项目及其权重。 此代码将从给定列表中选择一个权重为p的项。 问题答案: 不,但是您可以使用tf.multinomial获得相同的结果: 该部分在这里,正如预期的那样,该批次中每个元素的行都有未归一化的对数概率,并且对于样本数量还具有另一个维度。
numpy.random 模块对 Python 内置的 random 进行了补充,增加了一些用于高效生成符合多种概率分布的样本值的函数。这一小节将详述如何用 Numpy 快速创建随机数矩阵。 1. 创建符合均匀分布的随机数组 1.1 numpy.random.rand 函数 numpy.random.rand 函数通常用来创建一个服从 “0~1” 均匀分布的随机浮点数(组),随机样本取值范围是[0
我不熟悉随机文件访问,我遇到了一个问题——据我所知,RandomAccessFile类提供了一个用于读/写的随机访问文件。我可以使用seek()方法移动到首选位置并开始阅读或写作,但在这种情况下并不重要。完全是随机访问吗?但在FileInputStream中,我有同样的能力 这种方法提供了我从某个特定的地方阅读。那么,有什么区别呢?(我猜,输入流读取所有文件,但只是通过断路位置之前的所有符号,但它
aliyun 的 redis lua 的随机值不随机!? 同样的函数,在 redis 官方的 7.2.1 下面是每次都可以取到随机的 cookie 但是在 aliyun 的 redis 下面,每次取到的值都是一样的
问题内容: 当您要依次遍历数字列表时,您将编写: 但是,如果要随机遍历范围(0..999)的数字列表怎么办?需要(在每个迭代中)随机选择在任何先前迭代中未选择的数字,并且需要对范围(0..999)内的所有数字进行迭代。 你知道该怎么做(聪明)吗? 问题答案: 您可以习惯随机播放列表: 顺便说一句,在许多情况下,您将在其他编程语言中使用整数范围内的循环,则可以直接描述要在Python中迭代的“事物”
问题内容: 当他每次运行程序时都不断获得相同的数字时,我试图向Java解释随机数生成器。我为同一件事创建了自己的简单版本,每次运行该程序时,我也得到了与他得到的确切数字相同的数字。 我究竟做错了什么? 100个数字中的最后五个数字是: 问题答案: 您已经为随机数生成器提供了恒定的值。它是确定性的,因此每次运行都会生成相同的值。 我不确定您为什么选择使用作为种子,但是种子值与生成的值范围无关(这是由