随机种子
收藏回复举报
随机种子
发表于2023-11-30 23:59:49
0 查看

引入

#--------------------------------------------#  
#   设置种子  
def seed_everything(seed=11):  
    random.seed(seed)  
    np.random.seed(seed)  
    torch.manual_seed(seed)  
    torch.cuda.manual_seed(seed)  
    torch.cuda.manual_seed_all(seed)  
    torch.backends.cudnn.deterministic = True  
    torch.backends.cudnn.benchmark = False
#将torch.backends.cudnn.deterministic设置为True,以确保每次运行程序时使用的CuDNN算法是确定性的,而不是基于随机选择的。 
#将torch.backends.cudnn.benchmark设置为False,以禁用CuDNN的自动寻找最佳算法的功能,从而确保每次运行程序时使用相同的算法。

为CPU中设置种子,生成随机数 torch.mamual_seed(seed) 1 为特定GPU设置种子,生成随机数 torch.cuda.manual_seed(seed) 1 为所有GPU设置种子,生成随机数 torch.cuda.manual_seed_all(seed) 1 4.在Numpy内部也有随机种子,当你使用numpy中的随机数的时候,可以通过如下方式固定:

np.random.seed(seed)(另外还有python的内置模块random.seed(seed))

在多线程时,设置DataLoader随机种子

#---------------------------------------------------#  
#   设置Dataloader的种子  
#---------------------------------------------------#  
def worker_init_fn(worker_id, rank, seed):  
    worker_seed = rank + seed  
    random.seed(worker_seed)  
    np.random.seed(worker_seed)  
    torch.manual_seed(worker_seed)

这段代码中设置随机种子的目的是确保在使用多线程的DataLoader加载数据时,每个线程使用相同的随机数生成器种子来获取数据。这样做的好处是,不同线程之间获取的数据顺序是一致的,从而保证了训练的一致性和可重复性。

不同线程取数据的顺序是指在多线程环境下,不同线程从数据集中获取数据的顺序是一致的。具体来说,假设有一个数据集,其中包含10个样本,多线程的DataLoader会将数据集划分为多个批次,并为每个线程分配一个批次

当多个线程同时从数据集中获取数据时,每个线程会按照相同的顺序获取数据,但是每个线程获取的数据是不同的。换句话说,不同线程之间获取的数据是互不重复的,但是它们获取数据的顺序是一致的。 这种方式可以提高数据加载的效率,因为多个线程可以并行地从数据集中获取数据,而不会出现数据重复或顺序错乱的情况。同时,由于每个线程获取的数据顺序是一致的,可以确保训练过程中的数据顺序的一致性,从而提高模型的训练效果。

参考

【精选】【PyTorch】torch.manual_seed() 详解-CSDN博客

我要发帖子