首先在程序的开头设置:
torch.manual_seed(0)
torch.cuda.manual_seed(0)
torch.cuda.manual_seed_all(0) # 为所有GPU设置随机种子
np.random.seed(0)
random.seed(0)
以保证随机数一致
然后在定义DataLoador前,添加如下函数:
def worker_init_fn(worker_id):
# After creating the workers, each worker has an independent seed that is initialized to the curent random seed + the id of the worker
np.random.seed(0 + worker_id)
再在定义DataLoador时,输入以下设置:
worker_init_fn=worker_init_fn
在实例化模型后,训练模型前,添加如下语句:
cudnn.benckmark = False
cudnn.deterministic = True
其实主要分为了三个部分,第一个部分是np的随机数固定,第二个部分是用于固定DataLoador读取数据进行训练的顺序,使得每次送入模型的数据顺序保持一致,最后cudnn.benckmark如果被设为True则pytorch将针对于输入数据的分布会自动地寻找实现卷积操作效率最高的方式,以加快计算速度,而cudnn.deterministic如果被设为True的话,则Pytorch每次实现卷积操作时的方式都是固定的,即deterministic的意思。所以,如果设置了benckmark的话则deterministic就会被自动地设为False,因此,如果我们需要令我们的实验可重复的话,我们就要固定Pytorch实现卷积的方式,所以我们将cudnn.deterministic设为了True,将benckmark设为了False