1
import numpy as np
np.random.seed(500)
np.random.rand(5)
array([0.69367953, 0.06171699, 0.6666116 , 0.55920894, 0.08511062])
import torch
torch.manual_seed(500)
torch.rand(5)
为了能够复现数据,我们可以使用seed 来控制生成的随机数。设置seed数据来设定指定的随机数列,每次调用 随机数生成函数 ,就会从随机数列种读取数据,所以重复运行相同的随机数生成函数,得到的值并不相同。
2
torch.Generator().manual_seed(seed)
与直接调用 torch.manual_seed(seed)
的主要区别在于作用域和粒度上的不同。
torch.manual_seed(seed)
:
- 全局设置:调用
torch.manual_seed(seed)
会影响 PyTorch 中所有后续的随机数生成操作,且影响的是全局的随机数生成器。这意味着,无论是CPU还是GPU上的随机操作,都会使用这个种子生成随机数。 - 适用于所有随机数生成器:它会影响 PyTorch 中所有使用默认生成器的操作。例如,创建张量时使用
torch.randn()
或其他类似的随机生成函数时,它们都会受到这个种子的影响。
torch.Generator().manual_seed(seed)
:
- 局部设置:调用
torch.Generator().manual_seed(seed)
会创建一个新的torch.Generator
对象,并将种子应用到该对象。这个生成器仅对通过该生成器产生的随机数起作用,而不会影响全局默认的随机数生成器。 - 可用于多个生成器:通过显式创建和设置
Generator
对象,你可以为不同的操作或任务创建多个独立的随机数生成器,每个生成器可以拥有不同的种子。这在需要对不同的计算操作保持独立的随机数生成时非常有用。
区别总结:
-
全局 vs 局部:
torch.manual_seed(seed)
:影响全局的默认随机数生成器。torch.Generator().manual_seed(seed)
:创建并影响一个独立的随机数生成器,不会影响全局状态。
-
多重生成器支持:
- 如果你希望在不同的操作中使用不同的随机数生成器并控制它们的种子,可以使用
torch.Generator().manual_seed(seed)
。
- 如果你希望在不同的操作中使用不同的随机数生成器并控制它们的种子,可以使用
示例:
# 全局种子设置
torch.manual_seed(42) # 所有后续操作都会基于种子42生成
# 使用独立的生成器
gen = torch.Generator()
gen.manual_seed(42) # 这个生成器的随机数会基于种子42,但不会影响全局设置
random_tensor = torch.randn(3, 3, generator=gen)
在这个示例中,gen
是一个独立的随机数生成器,它的行为与全局设置无关,适用于需要多个不同随机生成器的场景。