1. 简介
在深度学习中,模型的训练过程中会涉及到随机数的使用,比如权重的初始化、数据的乱序等。然而,由于随机性的存在,每次运行代码时得到的结果可能不一样。这对于开发和测试工作会带来不便,因此我们需要保证每次运行使用的随机数都相同。
2. 随机数种子的设置
在 PyTorch 中,我们可以通过设置随机数种子来保证每次运行时生成的随机数次序一致。随机数种子可以看做是一个起始值,在相同的随机数种子下生成的随机数序列是相同的。
要设置随机数种子,首先要引入 random 模块,然后使用 random.seed 方法设置种子。
import random
random.seed(10)
在上述代码中,我们将随机数种子设置为 10。这样,每次运行代码时,生成的随机数序列都是相同的。
3. NumPy 的随机数种子
在 PyTorch 之外,如果我们还在代码中使用了 NumPy,那么也需要设置 NumPy 的随机数种子。
要设置 NumPy 的随机数种子,我们需要引入 numpy 模块,然后使用 numpy.random.seed 方法设置种子。
import numpy as np
np.random.seed(10)
同样地,上述代码将随机数种子设置为 10,保证每次运行时生成的随机数序列都是相同的。
4. PyTorch 中其他模块的随机性
除了使用 random.seed 和 np.random.seed 设置随机数种子外,还有一些 PyTorch 中的模块涉及到随机性:
4.1 torch.manual_seed
torch.manual_seed 是设置 PyTorch 中随机数种子的方法,与 random.seed 类似。它主要控制 PyTorch 内部的随机数生成,比如在使用 torchvision 进行数据增强时,可以使用 torch.manual_seed 来保证数据增强的一致性。
import torch
torch.manual_seed(10)
4.2 torch.cuda.manual_seed
torch.cuda.manual_seed 和 torch.manual_seed 类似,用于设置 PyTorch 在 GPU 上的随机数种子。如果我们在代码中使用了 GPU 加速,那么也需要设置该种子来保证结果的一致性。
torch.cuda.manual_seed(10)
5. 设置随机数种子的注意事项
在使用随机数种子时,需要注意以下几点:
5.1 Python 内置的随机数生成器是全局的
在 Python 中,调用 random 模块的相关方法时,其实是在操作全局的随机数生成器。因此,如果我们在不同的代码块中使用了不同的种子,可能会导致结果的不一致。
5.2 需要设置种子的地方
不是所有的随机数生成都需要设置种子。只有当我们需要在不同的运行之间保持结果的一致性时,才需要设置种子。
5.3 随机性的存在是有意义的
在深度学习中,随机性的存在是有意义的。它可以帮助模型在训练过程中发现不同的数据模式,从而提高模型的泛化能力。因此,在某些情况下,我们并不需要保证每次运行的随机数都相同。
6. 总结
保证每次运行使用的随机数都相同,是深度学习中一项非常重要的技巧。在 PyTorch 中,可以通过设置随机数种子来实现这一目标。同时需要注意的是,不是所有的随机数生成都需要设置种子,随机性在训练过程中也是有意义的。