简述python&pytorch 随机种子的实现

1. 简介

随机种子是在机器学习中常用的概念之一,它用于控制随机数生成器的输出。在深度学习中,随机种子对于实现可重复的实验结果、调试代码以及比较不同模型的性能非常重要。在Python和PyTorch中,我们可以设置随机种子来控制随机性的产生,保证实验的可复现性。

2. Python中的随机种子

2.1 random库

在Python中,我们可以使用random库来生成随机数。它提供了多种随机数生成器的方法,如生成随机整数、随机浮点数、随机选择等。

import random

random.seed(123) # 设置随机种子

random_int = random.randint(1, 100) # 生成1到100之间的随机整数

print(random_int)

在上面的代码中,通过调用random.seed()方法设置随机种子为123,然后使用random.randint()方法生成1到100之间的随机整数。不管运行多少次,输出结果都将是相同的。

2.2 numpy库

在数据处理和科学计算中,常常使用numpy库来进行数值计算。numpy库也提供了随机数生成的功能,并且可以通过设置随机种子来控制随机性。

import numpy as np

np.random.seed(123) # 设置随机种子

random_array = np.random.rand(3, 3) # 生成一个3x3的随机数组

print(random_array)

在上面的代码中,通过调用np.random.seed()方法设置随机种子为123,然后使用np.random.rand()方法生成一个3x3的随机数组。无论运行多少次,输出结果都将是相同的。

3. PyTorch中的随机种子

3.1 torch.manual_seed()

在PyTorch中,可以使用torch.manual_seed()方法来设置随机种子。这个方法主要用于控制生成随机数的种子以及控制生成随机数的方式。

import torch

torch.manual_seed(123) # 设置随机种子

random_tensor = torch.randn(3, 3) # 生成一个3x3的随机张量

print(random_tensor)

在上面的代码中,通过调用torch.manual_seed()方法设置随机种子为123,然后使用torch.randn()方法生成一个3x3的随机张量。不管运行多少次,输出结果都将是相同的。

3.2 其他随机种子相关函数

除了torch.manual_seed()方法之外,PyTorch还提供了其他与随机种子相关的函数。

torch.initial_seed(): 返回用于生成随机数的种子。

torch.get_rng_state(): 返回当前随机数生成器的状态。

torch.set_rng_state(state): 设置随机数生成器的状态。

seed = torch.initial_seed()  # 获取初始种子

print(seed)

state = torch.get_rng_state() # 获取随机数生成器的状态

torch.set_rng_state(state) # 设置随机数生成器的状态

上面的代码展示了这些函数的用法。我们可以通过torch.initial_seed()方法获取初始种子,通过torch.get_rng_state()方法获取当前随机数生成器的状态,然后使用torch.set_rng_state()方法设置随机数生成器的状态。

4. 设置全局随机种子

在实际的深度学习项目中,我们通常需要设置全局的随机种子。这样可以确保整个项目中的随机性都是可控的,并且保证实验的可复现性。

import random

import numpy as np

import torch

seed = 123

random.seed(seed)

np.random.seed(seed)

torch.manual_seed(seed)

torch.cuda.manual_seed(seed)

torch.backends.cudnn.deterministic = True

上面的代码展示了如何设置全局的随机种子。首先通过设置python的随机种子(random.seed())、numpy的随机种子(np.random.seed())和PyTorch的随机种子(torch.manual_seed())为相同的值。然后通过torch.cuda.manual_seed()设置PyTorch的GPU随机种子,最后通过torch.backends.cudnn.deterministic = True将CuDNN设置为确定性模式,确保GPU的计算结果也是可复现的。

5. 随机性调整

在深度学习中,对于一些模型而言,随机性是很重要的,尤其是在生成文本、图像等任务中。我们可以通过调整随机性的程度来改变模型生成的结果。

import torch

import torch.nn.functional as F

def adjust_temperature(logits, temperature=1.0):

logits = logits / temperature

return F.softmax(logits, dim=-1)

logits = torch.tensor([1.0, 2.0, 3.0])

adjusted_logits = adjust_temperature(logits, temperature=0.6)

print(adjusted_logits)

上面的代码展示了如何调整随机性。我们首先定义了一个adjust_temperature()函数,它接受logits和temperature两个参数。通过将logits除以temperature,可以调整logits的分布范围。然后使用torch.nn.functional中的softmax函数对调整后的logits进行归一化处理,得到最终的结果。

6. 总结

随机种子是保证实验的可复现性以及调试代码的重要工具。在Python中,我们可以使用random库和numpy库来设置随机种子。在PyTorch中,可以使用torch.manual_seed()方法来设置随机种子,并通过其他相关函数来获取随机数生成器的状态以及设置状态。设置全局随机种子可以保证整个项目中的随机性是可控的,并且可以通过调整随机性的程度来改变模型生成的结果。

后端开发标签