Python 随机种子介绍,PyTorch 中随机种子的设置与应用

什么是随机种子?

随机种子是针对 随机方法 而言的。

随机方法:常见的随机方法有 生成随机数,以及其他的像 随机排序 之类的,后者本质上也是 基于生成随机数来实现的。在深度学习中,比较常用的随机方法的应用有:网络的随机初始化训练集的随机打乱 等。

举个例子,如果我们简单调用 random.random() 来生成随机数,那么每一次生成的数都是随机的。但是,当我们预先使用 random.seed(x) 设定好随机种子基于这个种子来执行随机算法,这个时候我们 得到的随机数序列是相同的

随机种子的工作原理(计算机底层是如何实现生成随机数的)?

虽然计算机很擅长做精确计算,但是它们处理随机事件时非常不靠谱。

实际上,计算机中的所有随机数都是 伪随机数,是靠 随机数算法 生成的,随机数算法其实就是在努力创造一种 呈均匀分布且难以预测的 数据序列。

所有的随机数算法在初始化阶段都需要一个 随机“种子”(random seed),完全相同的种子每次将产生相同的“随机”数序列。如果我们没有手动进行显式设置,系统则 默认根据时间来选择这个值,此时每次生成的随机数因时间差异而不同。

随机种子的一些使用特性

① 随机种子的取值范围?

可以是任意数字,如10,1000

② 随机种子的作用范围

np.random.seed(0)
print(np.random.rand(3))
print(np.random.rand(3))

输出:

[0.5488135  0.71518937 0.60276338]
[0.54488318 0.4236548  0.64589411]

再次运行程序,会输出同一组随机数:

[0.5488135  0.71518937 0.60276338]
[0.54488318 0.4236548  0.64589411]

想要在同一个程序中产生同一组随机数,需要在下一个函数前设置一个相同的随机种子

np.random.seed(0)
print(np.random.rand(3))
np.random.seed(0)
print(np.random.rand(3))

输出:

[0.5488135  0.71518937 0.60276338]
[0.5488135  0.71518937 0.60276338]

为什么需要随机种子?

打个比方,在机器学习,深度学习算法中,我们往往会用到随机向量,随机矩阵,这使得我们每次运行算法计算出来的结果是不一致的,会为我们调试算法带来麻烦。

基于随机种子来实现代码中的随机方法,能够 保证多次运行此段代码能够得到完全一样的结果,即保证结果的 可复现性,这样 别人跑你的代码的时候也能够很好地复现出你的结果


PyTorch 中随机种子的设置方法

[参考资料]:Pytorch设置随机数种子,使训练结果可复现。

在使用 PyTorch 时,如果希望通过设置随机数种子,在 GPU 或 CPU 上固定每一次的训练结果,则需要在程序执行的开始处添加以下代码:

def setup_seed(seed):
     torch.manual_seed(seed)
     torch.cuda.manual_seed_all(seed)
     np.random.seed(seed)
     random.seed(seed)
     torch.backends.cudnn.deterministic = True
# 设置随机数种子
setup_seed(20)
# 预处理数据以及训练模型
# ...
# ...

随机数种子seed确定时,模型的训练结果将始终保持一致。

  • 21
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值