随机数概述
- 1.设置种子用于生成相同的随机数,使得结果是确定的,方便下次复现实验结果。
- 2.seed()用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed()值,则每次生成的随机数都相同。如果不设置随机种子,系统则会根据当前时间作为参数。
- 3.一个随机种子只能使用一次,作用于下一个随机数的生成。再有随机数生成的话,默认所使用的参数为系统时间(不是真实世界时间)。如果想要在一个脚本中生成好几个相同的随机数,那么就需要设置多个相同的随机种子。
- 4.即使只设置一个随机种子,如果设置生成两个随机数,他们的值会不一样,但是每次运行test.py脚本的全部输出结果还是一样的。因为第二个随机数的生成虽然不受第一个随机种子的影响,但是它在两次运行脚本的过程中使用的系统时间(程序运行到此处的时间)是相同的。
一、random.seed()
[python官方文档]https://docs.python.org/zh-cn/3/library/random.html
[random.seed()]https://blog.youkuaiyun.com/qq_42951560/article/details/112184965
此模块实现了各种分布的伪随机数生成器。random是python的内置模块,不需要安装,直接Import。
语法
random.seed(a=None, version=2)
# a是生成随机数的种子,可以设置为一个整型int
# 无返回值
示例(理解随机数概述2.)
- 设置随机种子
import random
random.seed(42)
print(random.random())
输出结果如下
生成的随机数位于[0.0, 1.0),是53位精度的浮点数。
- 如果不设置随机种子,则每次生成的输出结果不同。如下所示
import random
print(random.random())
print(random.random())
print(random.random())
二、numpy.random.seed()
[numpy.random.seed()]https://blog.youkuaiyun.com/qq_45288176/article/details/125117669
示例(理解随机数概述3.)
- 设置一个随机种子
import numpy as np
np.random.seed(42)
a = np.random.random()
b = np.random.random()
print(a)
print(b)
输出结果如下
- 设置多个随机种子
import numpy as np
np.random.seed(42)
a = np.random.random()
np.random.seed(42)
b = np.random.random()
print(a)
print(b)
输出结果如下
三、torch.manual_seed()
[官方文档torch.random]https://pytorch.ac.cn/docs/2.6/random.html
[torch.manual_seed]https://blog.youkuaiyun.com/weixin_44211968/article/details/123769010
语法
torch.manual_seed() # 返回一个torch.Generator对象
torch.manual_seed(42) # 为CPU设置种子,生成随机数
torch.cuda.manual_seed(42) # 为特定GPU设置种子,生成随机数
torch.cuda.manual_seed_all(42) # 为所有GPU设置种子,生成随机数
Torch生成随机数的四个函数
https://blog.youkuaiyun.com/qq_41813454/article/details/136326473
- torch.rand()
- torch.randn()
- torch.randint()
- torch.randperm()
示例(理解随机数概述4.)
此处使用torch.rand()函数作为示例。此函数用于生成具有均匀分布的随机数,这些随机数的范围在[0, 1)间。它接受一个形状参数(shape),返回一个指定形状的张量(tensor)。
- 不设置随机种子
import torch
# 生成一个形状为(3, 4)的张量,元素值在[0, 1)之间
tensor = torch.rand((3, 4))
print(tensor)
输出结果如下
- 设置随机种子
# test.py
import torch
torch.manual_seed(42)
print(torch.rand(3, 4))
print(torch.rand(3, 4))
第一次运行脚本输出结果如下
第二次运行脚本输出结果如下
可以发现生成的两个随机数是不一样的,但是两次运行脚本的全部输出结果是一样的。
四、ViT代码示例
def set_seed(args):
random.seed(args.seed)
np.random.seed(args.seed)
torch.manual_seed(args.seed)
if args.n_gpu > 0:
torch.cuda.manual_seed_all(args.seed)
且在函数中设置随机数种子并不需要返回值。
PS
至于为什么随机种子都设置为42,可能是因为深度学习领域一个约定俗成的习惯。