深度学习代码一样,但是每次跑的结果都不同(甚至相差很大)

发布时间:2024年01月13日

一、前言:

由于在跑代码时,发现自己每次跑的结果相差很大,于是询问其他同学的代码,他们的代码每次跑也不一样,但是结果相差是一个合理范围,而我的结果,就明显不合理。

我把自己的代码看了一遍,也没找到原因,然后去网上找找别人会不会有这样的情况,结果还是有人给我一样的情况,万千世界,无奇不有。

以下解决办法,不确保对你的有用,但是可以尝试。

二、解决办法

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

文章来源:https://blog.csdn.net/lihaiyuan_0324/article/details/135569217
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。