MENU

Python-seed

September 9, 2023 • Read: 121 • code阅读设置

参考其他博客
在深度学习训练过程中,为帮保证算法的可复现,通常设置随机种子保证多次训练的随机变量一致。

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()
2023-09-09T10:09:38.png

实例

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")

2023-09-09T10:09:02.png

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")

2023-09-09T10:27:26.png

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()
2023-09-09T12:34:30.png

实例

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")

2023-09-09T12:48:57.png

其他类似函数

  • 为特定GPU设置种子,生成随机数:torch.cuda.manual_seed(x)
  • 为所有GPU设置种子,生成随机数:torch.cuda.manual_seed_all(x)

使用原因:
在需要生成随机数据的实验中,每次实验都需要生成随机数据。
设置随机种子是为了确保每次生成固定的随机数,这就使得每次实验结果显示一致,有利于实验的比较和改进。
使得每次运行该.py文件时生成的随机数是相同的。