参考其他博客
在深度学习训练过程中,为帮保证算法的可复现,通常设置随机种子保证多次训练的随机变量一致。
random.seed()
定义
import random
random.seed(x)
print('随机数:', random.random())
seed
译为种子
,可以通过参数x
设置随机数生成器
的种子
为x
,即不同的x
对应不同的随机数生成器种子
。
每颗种子
能够生长为一组固定顺序
的随机数序列
,其通常与random.random()
搭配使用以生成一个随机数。
例如,若假定random.seed(1)
生成的随机数序列为(1, 2, 3, 4)
,则调用四次random.random()
,产生的结果依次为1, 2, 3, 4
。如果期间又执行了random.seed(1)
语句,则下一步调用random.random()
产生的结果又将变为1
,即从头开始,再按照固定顺序生成随机数。
官方文档:random.seed()
实例
import random
# 当不指定x的值时,系统将根据时间自己选择x的值
# 每次生成的随机数序列因时间差异而不同,所得到的随机数就不一样
random.seed()
random_num1 = random.random()
random_num2 = random.random()
# 当x = 1,同一颗种子对应的生成的随机数序列一致
# 以下代码为测试x = 1的种子对应的随机数序列的前两个
random.seed(1)
seed_num1 = random.random()
seed_num2 = random.random()
# 当x = 2,同一颗种子对应的生成的随机数序列一致
# 以下代码为测试x = 2的种子对应的随机数序列的前两个
random.seed(2)
seed2_num1 = random.random()
seed2_num2 = random.random()
# 这里重新执行了random.seed(1),因此之后生成的随机数将从头开始生成x = 1的种子对应的随机数序列
random.seed(1)
seed_num11 = random.random()
seed_num12 = random.random()
# 这里重新执行了random.seed(2),因此之后生成的随机数将从头开始生成x = 2的种子对应的随机数序列
random.seed(2)
seed2_num11 = random.random()
seed2_num12 = random.random()
print(seed_num1, seed_num2, seed_num11, seed_num12, sep="\n")
print('\n---------------------------------------------------------\n')
print(seed2_num1, seed2_num2, seed2_num11, seed2_num12, sep="\n")
numpy.random.seed()
定义
import numpy as np
random.seed(x)
print('随机数组:', np.random.randn(m, n))
np.random.seed(x)
的作用与random.seed(x)
作用基本相同,区别在于,np.random.seed(x)
是生成固定顺序
的随机数组序列
。简单地说,random.seed(x)
针对随机数
,np.random.seed(x)
针对随机数组
。
np.random.seed(x)
搭配np.random.randn(m, n)
来生成随机数组
。
实例
import numpy as np
np.random.seed()
random_num1 = np.random.randn(2, 2)
random_num2 = np.random.randn(2, 2)
np.random.seed(1)
seed_num1 = np.random.randn(2, 2)
seed_num2 = np.random.randn(2, 2)
np.random.seed(2)
seed2_num1 = np.random.randn(2, 2)
seed2_num2 = np.random.randn(2, 2)
np.random.seed(1)
seed_num11 = np.random.randn(2, 2)
seed_num12 = np.random.randn(2, 2)
np.random.seed(2)
seed2_num11 = np.random.randn(2, 2)
seed2_num12 = np.random.randn(2, 2)
print(seed_num1, seed_num2, seed_num11, seed_num12, sep="\n------seed = 1-----\n")
print('\n---------------------------------------------------------\n')
print(seed2_num1, seed2_num2, seed2_num11, seed2_num12, sep="\n------seed = 2-----\n")
torch.manual_seed()
定义
import torch
torch.manual_seed(x)
print('CPU随机张量:', torch.rand(*size)) # 返回一个size大小的张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数
与上述生成指定种子的随机数生成器类似,torch.manual_seed(x)
设置CPU生成随机数
的种子
为x
,方便下次复现实验结果。为CPU
设置种子用于生成随机数,以使结果是确定的。这里的随机数
准确地说是随机张量
。
官方文档:torch.manual_seed()
实例
import torch
# 不设置随机数种子时
t1 = torch.rand(1)
t2 = torch.rand(2)
# 设置随机数数种子为1时
torch.manual_seed(1)
seed_t1 = torch.rand(1)
seed_t2 = torch.rand(1)
# 设置随机数种子为2时
torch.manual_seed(2)
seed2_t1 = torch.rand(1)
seed2_t2 = torch.rand(1)
# 再次调用种子为1的随机数生成器
torch.manual_seed(1)
seed_t11 = torch.rand(1)
seed_t12 = torch.rand(1)
# 再次调用种子为2的随机数生成器
torch.manual_seed(2)
seed2_t11 = torch.rand(1)
seed2_t12 = torch.rand(1)
print(t1, t2, sep="\n")
print('\n---------------------------------------------------------\n')
print(seed_t1, seed_t2, seed_t11, seed_t12, sep="\n")
print('\n---------------------------------------------------------\n')
print(seed2_t1, seed2_t2, seed2_t11, seed2_t12, sep="\n")
其他类似函数
- 为特定
GPU
设置种子,生成随机数:torch.cuda.manual_seed(x)
- 为所有
GPU
设置种子,生成随机数:torch.cuda.manual_seed_all(x)
使用原因:
在需要生成随机数据的实验中,每次实验都需要生成随机数据。
设置随机种子是为了确保每次生成固定的随机数,这就使得每次实验结果显示一致,有利于实验的比较和改进。
使得每次运行该.py
文件时生成的随机数是相同的。