You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PyTorch中固定每次运行的训练与测试数据集?

固定PyTorch数据集划分结果的解决方案

问题根源:torch.utils.data.random_split 默认依赖全局随机数生成器,每次运行时随机种子不同,导致划分结果不一致。要固定测试集(以及训练、验证集)的划分,核心是固定随机种子并传递给random_split。

具体操作步骤

  • 第一步:固定全局随机种子(可选但推荐,避免其他环节的随机性干扰)
    除了PyTorch的种子,建议同时固定Python内置随机模块和NumPy的种子,确保整个流程的可复现性:

    import torch
    import random
    import numpy as np
    
    # 选一个固定的种子值,比如42(随便选整数就行)
    seed = 42
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    # 如果用GPU训练,还要固定cuda的种子
    torch.cuda.manual_seed_all(seed)
    
  • 第二步:用固定种子的生成器执行划分
    创建一个带固定种子的torch.Generator实例,传给random_split的generator参数,这样划分逻辑就会完全基于这个固定种子执行:

    from src.data import dataSetSource
    from torch.utils.data import random_split
    
    # 加载你的数据集
    dataset = dataSetSource()
    
    # 自定义划分比例,这里按7:2:1分训练/验证/测试
    total_len = len(dataset)
    train_size = int(0.7 * total_len)
    val_size = int(0.2 * total_len)
    test_size = total_len - train_size - val_size
    
    # 创建固定种子的生成器
    split_generator = torch.Generator().manual_seed(seed)
    
    # 执行划分,指定generator参数
    train_set, val_set, test_set = random_split(
        dataset,
        [train_size, val_size, test_size],
        generator=split_generator
    )
    

关键说明

  • 只要每次运行时seed值不变,test_set就会始终是同一批数据,训练和验证集的划分也会保持一致。
  • 如果你的数据加载或预处理环节有随机操作(比如随机裁剪、翻转等数据增强),也要给这些操作单独固定种子,才能实现完全的训练复现。

内容的提问来源于stack exchange,提问作者Urvesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 23:31:07