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

随机种子是什么?

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

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

关于python中的随机种子——random_state

举个例子,如果我们简单调用 random.random() 来生成随机数,那么每一次生成的数都是随机的。但是,当我们预先使用 random.seed(x) 设定好随机种子,基于这个种子来执行随机算法,这个时候我们得到的随机数序列是相同的实际上,所有的随机算法都需要提供随机种子,如果我们没有手动进行显式设置,系统则默认 根据时间 来选择这个值,此时每次生成的随机数因时间差异而不同】。

随机种子的一些具体特性

① 随机种子的取值范围?

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

② 随机种子的作用范围

<span style="color:#000000"><code class="language-python">np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>seed<span style="color:#999999">(</span><span style="color:#f1fa8c">0</span><span style="color:#999999">)</span>
<span style="color:#ff79c6">print</span><span style="color:#999999">(</span>np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span><span style="color:#f1fa8c">3</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
<span style="color:#ff79c6">print</span><span style="color:#999999">(</span>np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span><span style="color:#f1fa8c">3</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
</code></span>

输出:

<span style="color:#000000"><code class="language-python"><span style="color:#999999">[</span><span style="color:#f1fa8c">0.5488135</span>  <span style="color:#f1fa8c">0.71518937</span> <span style="color:#f1fa8c">0.60276338</span><span style="color:#999999">]</span>
<span style="color:#999999">[</span><span style="color:#f1fa8c">0.54488318</span> <span style="color:#f1fa8c">0.4236548</span>  <span style="color:#f1fa8c">0.64589411</span><span style="color:#999999">]</span>
</code></span>

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

<span style="color:#000000"><code class="language-python"><span style="color:#999999">[</span><span style="color:#f1fa8c">0.5488135</span>  <span style="color:#f1fa8c">0.71518937</span> <span style="color:#f1fa8c">0.60276338</span><span style="color:#999999">]</span>
<span style="color:#999999">[</span><span style="color:#f1fa8c">0.54488318</span> <span style="color:#f1fa8c">0.4236548</span>  <span style="color:#f1fa8c">0.64589411</span><span style="color:#999999">]</span>
</code></span>

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

<span style="color:#000000"><code class="language-python">np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>seed<span style="color:#999999">(</span><span style="color:#f1fa8c">0</span><span style="color:#999999">)</span>
<span style="color:#ff79c6">print</span><span style="color:#999999">(</span>np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span><span style="color:#f1fa8c">3</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>seed<span style="color:#999999">(</span><span style="color:#f1fa8c">0</span><span style="color:#999999">)</span>
<span style="color:#ff79c6">print</span><span style="color:#999999">(</span>np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span><span style="color:#f1fa8c">3</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
</code></span>

输出:

<span style="color:#000000"><code class="language-python"><span style="color:#999999">[</span><span style="color:#f1fa8c">0.5488135</span>  <span style="color:#f1fa8c">0.71518937</span> <span style="color:#f1fa8c">0.60276338</span><span style="color:#999999">]</span>
<span style="color:#999999">[</span><span style="color:#f1fa8c">0.5488135</span>  <span style="color:#f1fa8c">0.71518937</span> <span style="color:#f1fa8c">0.60276338</span><span style="color:#999999">]</span>
</code></span>

思考

1、使用了随机种子来固定输出,那还能算是随机吗?

2、计算机底层是如何实现生成随机数的?

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

随机数是一个难题。大多数随机数算法都努力创造一种 呈均匀分布且难以预测的 数据序列,但是在算法初始化阶段都需要提供随机数“种子”(random seed)。而完全相同的种子每次将产生相同的“随机”数序列,因此 用系统时间作为数序列生成的起点,会让程序运行的时候更具有随机性。

为什么要用随机种子?

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


PyTorch中随机种子的设置

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

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

<span style="color:#000000"><code class="language-python"><span style="color:#ff79c6">def</span> <span style="color:#8be9fd">setup_seed</span><span style="color:#999999">(</span>seed<span style="color:#999999">)</span><span style="color:#999999">:</span>
     torch<span style="color:#999999">.</span>manual_seed<span style="color:#999999">(</span>seed<span style="color:#999999">)</span>
     torch<span style="color:#999999">.</span>cuda<span style="color:#999999">.</span>manual_seed_all<span style="color:#999999">(</span>seed<span style="color:#999999">)</span>
     np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>seed<span style="color:#999999">(</span>seed<span style="color:#999999">)</span>
     random<span style="color:#999999">.</span>seed<span style="color:#999999">(</span>seed<span style="color:#999999">)</span>
     torch<span style="color:#999999">.</span>backends<span style="color:#999999">.</span>cudnn<span style="color:#999999">.</span>deterministic <span style="color:#6272a4">=</span> <span style="color:#8be9fd">True</span>
<span style="color:#6272a4"># 设置随机数种子</span>
setup_seed<span style="color:#999999">(</span><span style="color:#f1fa8c">20</span><span style="color:#999999">)</span>
<span style="color:#6272a4"># 预处理数据以及训练模型</span>
<span style="color:#6272a4"># ...</span>
<span style="color:#6272a4"># ...</span>
</code></span>

随机数种子seed确定时,模型的训练结果将始终保持一致。(加v 一起学习 hailou1666)

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

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

关于python中的随机种子——random_state

举个例子,如果我们简单调用 random.random() 来生成随机数,那么每一次生成的数都是随机的。但是,当我们预先使用 random.seed(x) 设定好随机种子,基于这个种子来执行随机算法,这个时候我们得到的随机数序列是相同的实际上,所有的随机算法都需要提供随机种子,如果我们没有手动进行显式设置,系统则默认 根据时间 来选择这个值,此时每次生成的随机数因时间差异而不同】。

随机种子的一些具体特性

① 随机种子的取值范围?

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

② 随机种子的作用范围

<span style="color:#000000"><code class="language-python">np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>seed<span style="color:#999999">(</span><span style="color:#f1fa8c">0</span><span style="color:#999999">)</span>
<span style="color:#ff79c6">print</span><span style="color:#999999">(</span>np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span><span style="color:#f1fa8c">3</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
<span style="color:#ff79c6">print</span><span style="color:#999999">(</span>np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span><span style="color:#f1fa8c">3</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
</code></span>

输出:

<span style="color:#000000"><code class="language-python"><span style="color:#999999">[</span><span style="color:#f1fa8c">0.5488135</span>  <span style="color:#f1fa8c">0.71518937</span> <span style="color:#f1fa8c">0.60276338</span><span style="color:#999999">]</span>
<span style="color:#999999">[</span><span style="color:#f1fa8c">0.54488318</span> <span style="color:#f1fa8c">0.4236548</span>  <span style="color:#f1fa8c">0.64589411</span><span style="color:#999999">]</span>
</code></span>

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

<span style="color:#000000"><code class="language-python"><span style="color:#999999">[</span><span style="color:#f1fa8c">0.5488135</span>  <span style="color:#f1fa8c">0.71518937</span> <span style="color:#f1fa8c">0.60276338</span><span style="color:#999999">]</span>
<span style="color:#999999">[</span><span style="color:#f1fa8c">0.54488318</span> <span style="color:#f1fa8c">0.4236548</span>  <span style="color:#f1fa8c">0.64589411</span><span style="color:#999999">]</span>
</code></span>

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

<span style="color:#000000"><code class="language-python">np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>seed<span style="color:#999999">(</span><span style="color:#f1fa8c">0</span><span style="color:#999999">)</span>
<span style="color:#ff79c6">print</span><span style="color:#999999">(</span>np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span><span style="color:#f1fa8c">3</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>seed<span style="color:#999999">(</span><span style="color:#f1fa8c">0</span><span style="color:#999999">)</span>
<span style="color:#ff79c6">print</span><span style="color:#999999">(</span>np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>rand<span style="color:#999999">(</span><span style="color:#f1fa8c">3</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
</code></span>

输出:

<span style="color:#000000"><code class="language-python"><span style="color:#999999">[</span><span style="color:#f1fa8c">0.5488135</span>  <span style="color:#f1fa8c">0.71518937</span> <span style="color:#f1fa8c">0.60276338</span><span style="color:#999999">]</span>
<span style="color:#999999">[</span><span style="color:#f1fa8c">0.5488135</span>  <span style="color:#f1fa8c">0.71518937</span> <span style="color:#f1fa8c">0.60276338</span><span style="color:#999999">]</span>
</code></span>

思考

1、使用了随机种子来固定输出,那还能算是随机吗?

2、计算机底层是如何实现生成随机数的?

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

随机数是一个难题。大多数随机数算法都努力创造一种 呈均匀分布且难以预测的 数据序列,但是在算法初始化阶段都需要提供随机数“种子”(random seed)。而完全相同的种子每次将产生相同的“随机”数序列,因此 用系统时间作为数序列生成的起点,会让程序运行的时候更具有随机性。

为什么要用随机种子?

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


PyTorch中随机种子的设置

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

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

<span style="color:#000000"><code class="language-python"><span style="color:#ff79c6">def</span> <span style="color:#8be9fd">setup_seed</span><span style="color:#999999">(</span>seed<span style="color:#999999">)</span><span style="color:#999999">:</span>
     torch<span style="color:#999999">.</span>manual_seed<span style="color:#999999">(</span>seed<span style="color:#999999">)</span>
     torch<span style="color:#999999">.</span>cuda<span style="color:#999999">.</span>manual_seed_all<span style="color:#999999">(</span>seed<span style="color:#999999">)</span>
     np<span style="color:#999999">.</span>random<span style="color:#999999">.</span>seed<span style="color:#999999">(</span>seed<span style="color:#999999">)</span>
     random<span style="color:#999999">.</span>seed<span style="color:#999999">(</span>seed<span style="color:#999999">)</span>
     torch<span style="color:#999999">.</span>backends<span style="color:#999999">.</span>cudnn<span style="color:#999999">.</span>deterministic <span style="color:#6272a4">=</span> <span style="color:#8be9fd">True</span>
<span style="color:#6272a4"># 设置随机数种子</span>
setup_seed<span style="color:#999999">(</span><span style="color:#f1fa8c">20</span><span style="color:#999999">)</span>
<span style="color:#6272a4"># 预处理数据以及训练模型</span>
<span style="color:#6272a4"># ...</span>
<span style="color:#6272a4"># ...</span>
</code></span>

随机数种子seed确定时,模型的训练结果将始终保持一致。(加v 一起学习 hailou1666)

猜你喜欢

转载自blog.csdn.net/xixi20200/article/details/108772166