pytorch 简单例子,pytorch随机数
原则
在神经网络中,默认参数是随机初始化的。不同的初始化参数往往会导致不同的结果。
如果我们得到一个好的结果,那么我们通常希望结果是可复制的,但是在pytorch中,我们可以通过设置一个全局随机数种子来达到这个目的。
特定操作
在随机数生成器中设置固定种子的操作分为四个部分。
1.加速库
cudnn对卷积运算进行了优化,牺牲了精度,换来了计算效率。
为了确保再现性,可以使用以下设置:
从torch.backends导入cudnn
Cu dnn.benchmark=false #如果benchmark=true,确定性将为false
cudnn.deterministic=True
但是,实际上这个设置对精度没有影响。只是小数点以下位数的区别。所以如果不要求非常高的精度,计算效率会降低,不建议进行修正。
2.PyTorch
种子=0
Torch.manual_seed(种子)设置CPU的随机种子
Torch.cuda.manual_seed(种子)#设置当前GPU的随机种子
torch . cuda . manual _ seed _ all(seed)#为所有GPU设置随机种子
3.矩阵相乘
如果读取数据的过程采用随机预处理(比如RandomCrop和RandomHorizontalFlip),还必须为python和numpy随机数生成器设置种子。
导入操作系统
随机导入
进口编号为NP
种子=0
随机种子(种子).
NP。随机种子(种子).
OS . environ[ python hasseed ]=str(seed)#为了禁止hash的随机化,使得实验成为可能。
4.数据加载器
如果dataloader采用多线程(num_workers 1),最终的执行结果取决于读取数据的顺序。也就是说,改变num_workers参数也会影响实验结果。
虽然目前还没有找到解决这个问题的方法,但是只要固定num_workers(线程数)的数量,基本上可以重复实验结果。
不同线程的随机数种子设置主要通过DataLoader的worker_init_fn参数实现。默认情况下,线程ID用作随机数种子。如果需要自己设置,请参考下面的代码:
GLOBAL_SEED=1
defset_seed(种子) :
随机种子(种子).
NP。随机种子(种子).
torch.manual_seed(种子)
torch.cuda.manual_seed(种子)
torch . cuda . manual _ seed _ all(seed)
GLOBAL _ WORKER _ ID=无
efWorker_init_fn(Worker_id):
全球GLOBAL_WORKER_ID
全局工人标识=工人标识
set_seed(全局种子员工标识)
dataloader=dataloader(dataset,batch_size=16,shuffle=True,num_workers=2,worker_init_fn=worker)
涉及
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。