平时都会使用到随机模块,一般是torch.random或者是numpy.random,有或者是直接使用ramdom这个python内置的工具包,那么下面就简单记录一下numpy.random常用的函数。
1. 随机抽样
import numpy as np np.random.randn(3,3) # 从标准正太分布中返回样本 np.random.rand(3,3) # 从0-1均匀分布分布中返回样本 np.random.randint(0, 10, size=(3,3)) # 返回随机的整数,左闭右开区间[) np.random.random_integers(0, 10, (3,3)) # 返回随机的整数,位于闭区间[] np.random.random((3,3)) # 返回范围[0., 1.)之间的随机浮点数 np.random.random_sample((3,3)) # 返回范围[0., 1.)之间的随机浮点数 np.random.ranf((3,3)) # 返回范围[0., 1.)之间的随机浮点数 np.random.sample((3,3)) # 返回范围[0., 1.)之间的随机浮点数 # 从[0,5)中挑选3个数,其权重分别为p,其中np.random.choice(5, 3) == np.random.randint(0, 5, 3) np.random.choice(5, 3, p=[0.1, 0.25, 0.15, 0.4, 0.1]) # 从样本中根据对应的权重返回随机选择索引,权重越大越可能被选择到
2. 随机排序
import numpy as np np.random.shuffle(arr) # 随机打乱顺序,直接是内置的,不需要返回 arr = np.random.permutation(arr) # 随机打乱顺序,需要返回
3. 随机分布
4. 随机种子
# 1. RandomState随机种子的使用:numpy.random.RandomState实例对象是线程安全的 from numpy.random import RandomState r = RandomState(1234567890) a = r.randint(1, 10,size=10) r = RandomState(1234567890) b = r.randint(1, 10, size=10) r = RandomState(1234567890) c = r.randint(1, 10, size=10) r = RandomState(1234567890) d = r.randint(1, 10, size=10) a,b,c,d # 输出: # (array([3, 7, 4, 2, 5, 1, 7, 5, 1, 8]), # array([3, 7, 4, 2, 5, 1, 7, 5, 1, 8]), # array([3, 7, 4, 2, 5, 1, 7, 5, 1, 8]), # array([3, 7, 4, 2, 5, 1, 7, 5, 1, 8])) # 分析:由于每次输出前都设置了相同的随机种子,所以程序得到的随机数的值相同 # 2. np.random.seed随机种子的使用:numpy.random.seed()不是线程安全的 # 如果程序中有多个线程最好使用numpy.random.RandomState实例对象来创建或者使用random.seed()来设置相同的随机数种子。 np.random.seed(1234567890) a = np.random.randint(1, 10, size=10) np.random.seed(1234567899) b = np.random.randint(1, 10, size=10) np.random.seed(1234567890) c = np.random.randint(1, 10, size=10) np.random.seed(1234567899) d = np.random.randint(1, 10, size=10) a,b,c,d # 输出: # (array([3, 7, 4, 2, 5, 1, 7, 5, 1, 8]), # array([4, 9, 1, 7, 2, 8, 8, 3, 3, 4]), # array([3, 7, 4, 2, 5, 1, 7, 5, 1, 8]), # array([4, 9, 1, 7, 2, 8, 8, 3, 3, 4])) # 分析:由于第一次与第三次输出前设置了相同的随机种子,而第二次与第四次输出前设置了相同的随机种子 # 所以第一次与第三次输出一致,第二次与第四次输出一致。 # 3. ramdom随机种子的使用 import random random.seed(1234567890) a = random.sample(range(10),10) random.seed(1234567890) b = random.sample(range(10),10) c = random.sample(range(10),10) d = random.sample(range(10),10) a,b,c,d # 输出: # ([9, 2, 7, 1, 4, 8, 5, 0, 6, 3], # [9, 2, 7, 1, 4, 8, 5, 0, 6, 3], # [6, 2, 0, 5, 8, 9, 4, 1, 7, 3], # [2, 7, 3, 8, 6, 1, 4, 9, 0, 5]) # 分析:由于第一次与第二次输出前设置了相同的随机种子,所以输出结果一致; # 而剩下两次没有设置随机种子,随意两次结果都是随机输出的,分别不同
拓展,在训练开始时,参数的初始化是随机的,为了让每次的结果一致,我们需要设置随机种子。torch中的随机种子使用如下:
opt.seed = random.randint(1, 10000) print("Random Seed: ", opt.seed) torch.manual_seed(args.seed) # 为CPU设置随机种子 if cuda: torch.cuda.manual_seed(seed) # 为当前GPU设置随机种子 torch.cuda.manual_seed_all(seed)# 为所有GPU设置随机种子
参考资料:
1. random VS numpy.random
2.numpy.random用法
3. 深度学习pytorch代码各种常见头文件


