通过一些设置我们可以让基于PyTorch的实验结果是可复现的
1 2 3 4 5 6 7 8 def same_seed (seed ): '''Fixes random number generator seeds for reproducibility.''' torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False np.random.seed(seed) torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed_all(seed)
当torch.backends.cudnn.deterministic
为True
时,cuDNN只使用确定性的卷积算法。
当torch.backends.cudnn.benchmark
为True
时,会让cuDNN对多个卷积算法进行基准测试,从中选出最快的。
np.random.seed()
, torch.manual_seed()
, torch.cuda.manual_seed_all()
都是在对种子进行设置,需要注意的是,如果要使用GPU加速,那么cuda需要单独设置种子。
cuDNN(CUDA Deep Neural Network)是由Nvidia 提供的用于深度神经网络构建的GPU加速库。
torch.backends这个库包含了PyTorch的各种后端行为控制。
数据集划分
数据集划分的时候我们也希望能够设定随机种子:
1 2 3 4 5 6 7 8 from torch.utils.data import random_splitdef train_valid_split (data_set, valid_ratio, seed ): '''Split provided training data into training set and validation set''' valid_set_size = int (valid_ratio * len (data_set)) train_set_size = len (data_set) - valid_set_size train_set, valid_set = random_split(data_set, [train_set_size, valid_set_size], generator=torch.Generator().manual_seed(seed)) return np.array(train_set), np.array(valid_set)
random_split()
中的generator
参数是用于随机排列的生成器,使用一样的seed就能保证,每次划分的结果一致。
class torch.Generator()
Generator类会返回一个对象,用于管理伪随机数的生成。