如何在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
相关产品推荐
相关产品推荐

