🍉 CSDN叶庭云:https://yetingyun.blog.csdn.net/
为什么要固定随机性?在深度学习中,固定随机性至关重要,原因主要有三点:
Python 中的随机性来源。在 Python 中,主要的随机性来源包括:
/dev/urandom)。在类 Unix 操作系统中,/dev/random 和 /dev/urandom 是两个特殊的文件,它们被用作密码学安全的伪随机数生成器(CSPRNGs)。PyTorch 中的随机性来源。PyTorch 中的随机性主要源自三个方面:
torch.manual_seed() 函数的设置。现在,让我们详细讲解如何固定这些随机性:
固定 Python 的随机性:
import random import numpy as np # 设置 Python 的 random 模块的种子 random.seed(42) # 设置 numpy 的随机种子 np.random.seed(42) 固定 PyTorch 的随机性:
import torch # 设置 PyTorch 的随机种子 torch.manual_seed(42) # 如果使用 CUDA(GPU),还需要设置 CUDA 的随机种子 if torch.cuda.is_available(): torch.cuda.manual_seed(42) torch.cuda.manual_seed_all(42) # 如果使用多 GPUs # 设置 cuDNN torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False 固定数据加载的随机性。如果使用 PyTorch 的 DataLoader,需要设置其 worker 的随机种子:
def seed_worker(worker_id): worker_seed = torch.initial_seed() % 2**32 np.random.seed(worker_seed) random.seed(worker_seed) g = torch.Generator() g.manual_seed(42) dataloader = DataLoader( dataset, batch_size=32, num_workers=4, worker_init_fn=seed_worker, generator=g ) 固定数据增强的随机性。如果使用 torchvision 进行数据增强,可以这样设置:
from torchvision import transforms # 在应用 transform 之前,设置随机种子 torch.manual_seed(42) transform = transforms.Compose([ transforms.RandomHorizontalFlip(p=0.5), transforms.RandomRotation(10), transforms.ToTensor(), ]) 环境变量设置。为了更全面地控制随机性,可以设置以下环境变量:
import os os.environ['PYTHONHASHSEED'] = str(42) 完整示例。下面是一个结合了上述所有步骤的完整示例:
import os import random import numpy as np import torch from torch.utils.data import DataLoader def set_seed(seed=42): random.seed(seed) os.environ['PYTHONHASHSEED'] = str(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed) torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False def seed_worker(worker_id): worker_seed = torch.initial_seed() % 2**32 np.random.seed(worker_seed) random.seed(worker_seed) # 设置全局种子 set_seed(42) # 创建数据加载器 g = torch.Generator() g.manual_seed(42) dataloader = DataLoader( dataset, batch_size=32, num_workers=4, worker_init_fn=seed_worker, generator=g ) # 模型训练代码... 注意事项:
总体而言,遵循上述步骤,我们能够有效地管理 Python 及 PyTorch 中的随机性,确保神经网络训练和评估的结果具备高度的可重现性。这对于调试过程、模型间的比较以及保证实验的科学严谨性均至关重要。不过,亦需铭记于心,随机性在某些情境下有其积极作用,特别是促进模型泛化能力的提升。因此,在最终模型训练阶段,寻找可重现性与泛化能力之间的最佳平衡点显得尤为重要。