在机器学习和深度学习任务中,随机性是一个常见的因素。在某些情况下,我们希望能够获得可复现的结果,以便于调试、复现实验结果或确保结果的一致性。为了实现这一目标,设置随机种子是一种常用的方法。
在本篇博客中,将介绍如何使用Python和一些常用的库来设置随机种子,以确保在相同的种子下生成的随机数序列是一致的。
设置随机种子的方法
def seed_all(seed):
"""
设置PyTorch的随机种子, 用于生成随机数. 通过设置相同的种子, 可以确保每次运行时生成的随机数序列相同
"""
torch.manual_seed(seed)
"""
设置PyTorch在所有可用的CUDA设备上的随机种子. 如果在使用GPU进行计算, 这个设置可以确保在不同的GPU上生成的随机数序列相同
"""
torch.cuda.manual_seed_all(seed)
"""
设置PyTorch在当前CUDA设备上的随机种子. 它与上一行代码的作用类似, 但只影响当前设备
"""
torch.cuda.manual_seed(seed)
"""
设置NumPy的随机种子, 用于生成随机数. 通过设置相同的种子,可以确保在使用NumPy的随机函数时生成的随机数序列相同
"""
np.random.seed(seed)
"""
设置Python内置的随机函数的种子. Python的random模块提供了许多随机函数, 包括生成随机数、打乱列表等. 通过设置相同的种子, 可以确保使用这些随机函数时生成的随机数序列相同
"""
random.seed(seed)
"""
设置Python的哈希种子 (哈希函数被广泛用于数据结构 (如字典和集合) 的实现,以及一些内部操作 (如查找和比较)). 通过设置相同的种子, 可以确保在不同的运行中生成的哈希结果相同
"""
os.environ["PYTHONHASHSEED"] = str(seed)
"""
该设置确保每次运行代码时, cuDNN的计算结果是确定性的, 即相同的输入会产生相同的输出, 这是通过禁用一些非确定性的算法来实现的, 例如在卷积操作中使用的算法. 这样做可以保证模型的训练和推理在相同的硬件和软件环境下是可复现的, 即每次运行代码时的结果都相同. 但是, 这可能会导致一些性能上的损失, 因为禁用了一些优化的非确定性算法
"""
torch.backends.cudnn.deterministic = True
"""
该设置禁用了cuDNN的自动优化过程. 当它被设置为False时, PyTorch不会在每次运行时重新寻找最优的算法配置, 而是使用固定的算法配置. 这样做可以确保每次运行代码时的性能是一致的, 但可能会导致一些性能上的损失
"""
torch.backends.cudnn.benchmark = False