在利用 Python 编码和 PyTorch 深度学习框架训练神经网络和实验评估时,如何控制所有可能的随机性?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/


为什么要固定随机性?在深度学习中,固定随机性至关重要,原因主要有三点:

  • 确保实验的可重现性:这样每次运行代码时都能得到相同的结果,便于验证和复现实验结果。
  • 简化调试过程:当结果可重现时,更容易追踪问题源头,找出并修复错误。
  • 实现公平比较:在评估不同模型或方法时,消除随机性带来的偏差,确保比较结果准确可靠。

Python 中的随机性来源。在 Python 中,主要的随机性来源包括:

  • random 模块
  • numpy 库
  • 操作系统级别的随机性(如 /dev/urandom)。在类 Unix 操作系统中,/dev/random/dev/urandom 是两个特殊的文件,它们被用作密码学安全的伪随机数生成器(CSPRNGs)。

PyTorch 中的随机性来源。PyTorch 中的随机性主要源自三个方面:

  • torch.manual_seed() 函数的设置。
  • CUDA 操作,特别是当使用 GPU 进行加速时。
  • 数据加载与数据增强过程中的随机性处理。

现在,让我们详细讲解如何固定这些随机性:

固定 Python 的随机性:

python 复制代码
import random
import numpy as np

# 设置 Python 的 random 模块的种子
random.seed(42)

# 设置 numpy 的随机种子
np.random.seed(42)

固定 PyTorch 的随机性:

python 复制代码
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 的随机种子:

python 复制代码
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 进行数据增强,可以这样设置:

python 复制代码
from torchvision import transforms

# 在应用 transform 之前,设置随机种子
torch.manual_seed(42)

transform = transforms.Compose([
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.RandomRotation(10),
    transforms.ToTensor(),
])

环境变量设置。为了更全面地控制随机性,可以设置以下环境变量:

python 复制代码
import os

os.environ['PYTHONHASHSEED'] = str(42)

完整示例。下面是一个结合了上述所有步骤的完整示例:

python 复制代码
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
)

# 模型训练代码...

注意事项:

  • 尽管我们已尽力消除所有可能的随机性因素,但在不同的硬件、操作系统或 PyTorch 版本上,仍可能观察到细微的差异。
  • 固定随机性可能会对模型的泛化能力产生一定影响。因此,在进行最终模型训练时,建议考虑移除这些限制措施。
  • 请注意,某些 PyTorch 操作(如 dropout)在推理模式下表现为确定性,而在训练模式下则具有随机性。为确保评估的准确性,请在使用前调用 model.eval() 方法。

总体而言,遵循上述步骤,我们能够有效地管理 Python 及 PyTorch 中的随机性,确保神经网络训练和评估的结果具备高度的可重现性。这对于调试过程、模型间的比较以及保证实验的科学严谨性均至关重要。不过,亦需铭记于心,随机性在某些情境下有其积极作用,特别是促进模型泛化能力的提升。因此,在最终模型训练阶段,寻找可重现性与泛化能力之间的最佳平衡点显得尤为重要。

相关推荐
FL162386312910 分钟前
基于yolov11的打电话玩手机检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
python·yolo·智能手机
动能小子ohhh19 分钟前
Python中的客户端和服务端交互的基本内容
开发语言·python
hongjianMa31 分钟前
【论文阅读】Joint Deep Modeling of Users and Items Using Reviews for Recommendation
论文阅读·python·深度学习·卷积神经网络·推荐系统·推荐算法·多模态
小西几哦1 小时前
Deformable DETR模型解读(附源码+论文)
图像处理·pytorch·目标检测·计算机视觉·transformer
Francek Chen1 小时前
【现代深度学习技术】现代循环神经网络07:序列到序列学习(seq2seq)
人工智能·pytorch·rnn·深度学习·神经网络·序列
编程有点难2 小时前
Python训练打卡Day16
开发语言·python
LS_learner3 小时前
视频转GIF
python
蹦蹦跳跳真可爱5894 小时前
Python----机器学习(模型评估:准确率、损失函数值、精确度、召回率、F1分数、混淆矩阵、ROC曲线和AUC值、Top-k精度)
人工智能·python·机器学习
蓝莓味柯基8 小时前
Python 学习路线与笔记跳转(持续更新笔记链接)
笔记·python·学习
唤醒手腕9 小时前
2025 年如何使用 Pycharm、Vscode 进行树莓派 Respberry Pi Pico 编程开发详细教程(更新中)
ide·python·pycharm