0%

PyTorch复现

通过一些设置我们可以让基于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)
  1. torch.backends.cudnn.deterministicTrue时,cuDNN只使用确定性的卷积算法。
  2. torch.backends.cudnn.benchmarkTrue时,会让cuDNN对多个卷积算法进行基准测试,从中选出最快的。
  3. np.random.seed(), torch.manual_seed(), torch.cuda.manual_seed_all()都是在对种子进行设置,需要注意的是,如果要使用GPU加速,那么cuda需要单独设置种子。
  4. cuDNN(CUDA Deep Neural Network)是由Nvidia提供的用于深度神经网络构建的GPU加速库。
  5. torch.backends这个库包含了PyTorch的各种后端行为控制。

数据集划分

数据集划分的时候我们也希望能够设定随机种子:

1
2
3
4
5
6
7
8
from torch.utils.data import random_split

def 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类会返回一个对象,用于管理伪随机数的生成。