深度学习代码一样,但是每次跑的结果都不同(甚至相差很大) |
您所在的位置:网站首页 › 跑图指令每次都要输入吗知乎 › 深度学习代码一样,但是每次跑的结果都不同(甚至相差很大) |
一、前言:
由于在跑代码时,发现自己每次跑的结果相差很大,于是询问其他同学的代码,他们的代码每次跑也不一样,但是结果相差是一个合理范围,而我的结果,就明显不合理。 我把自己的代码看了一遍,也没找到原因,然后去网上找找别人会不会有这样的情况,结果还是有人给我一样的情况,万千世界,无奇不有。 以下解决办法,不确保对你的有用,但是可以尝试。 二、解决办法 1.设置随机种子因为代码在运行时,会产生随机数,如果不设置随机种子,很有可能每次出现随机数不同,进而可能导致结果出现差异。 请看下面这个实验: import numpy as np import torch print("Numpy随机数:不设置随机种子") for i in range(5): print(np.random.rand(1)) print('-' * 50) print("Numpy随机数:设置随机种子") for j in range(5): np.random.seed(42) print(np.random.rand(1)) print('-' * 50) print("PyTorch随机数:不设置随机种子") for i in range(5): print(torch.rand(1)) print('-' * 50) print("PyTorch随机数:设置随机种子") for j in range(5): torch.manual_seed(42) print(torch.rand(1))下面是结果: Numpy随机数:不设置随机种子 [0.6510666] [0.24762528] [0.25380042] [0.2385413] [0.40977083] -------------------------------------------------- Numpy随机数:设置随机种子 [0.37454012] [0.37454012] [0.37454012] [0.37454012] [0.37454012] -------------------------------------------------- PyTorch随机数:不设置随机种子 tensor([0.1280]) tensor([0.1837]) tensor([0.0940]) tensor([0.5511]) tensor([0.5864]) -------------------------------------------------- PyTorch随机数:设置随机种子 tensor([0.8823]) tensor([0.8823]) tensor([0.8823]) tensor([0.8823]) tensor([0.8823])注意:随机种子理论上是随便设置,有人设置"0","1234", "2024","42"等。但是不同的随机种子可能会导致结果的好坏,这里面有一点玄学成分。 上面实验中,我设置的随机种子是**"42",下面实验,我设置为"0"**,看看生成的随机数有什么不同。 Numpy随机数:不设置随机种子 [0.69071155] [0.99423298] [0.23947714] [0.25467987] [0.23614593] -------------------------------------------------- Numpy随机数:设置随机种子 [0.5488135] [0.5488135] [0.5488135] [0.5488135] [0.5488135] -------------------------------------------------- PyTorch随机数:不设置随机种子 tensor([0.6033]) tensor([0.5968]) tensor([0.8032]) tensor([0.9530]) tensor([0.7456]) -------------------------------------------------- PyTorch随机数:设置随机种子 tensor([0.4963]) tensor([0.4963]) tensor([0.4963]) tensor([0.4963]) tensor([0.4963])可以看出,随机种子不同,生成的随机数也不同,造成结果好坏的原因可能是:随机种子“0”生成的随机数”0.4963“比随机种子“42”生成的随机数“0.8823”更适合你的程序。 因此,在你程序最开始的地方,调用一下这个函数。 def set_random_seed(seed, deterministic=False): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) # 为一个GPU设置随机种子 torch.cuda.manual_seed_all(seed) # 为多个GPU设置同一随机种子 if deterministic: # 以下操作涉及cudnn,一般为False,也可以设置为True,尝试一下。 torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False 2.多运行几次取平均值这个解决办法,就是无奈之举了。 比如:跑5次或者10次取个平均值。 还可以取最高的一次,这个还是要询问一下,导师或者领导的意见吧! 参考文献1.https://blog.csdn.net/yyywxk/article/details/121606566? 2.https://blog.csdn.net/qq_28531269/article/details/121109486? 3.https://blog.csdn.net/baidu_39389949/article/details/121412455 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |