pytorch用同一个随机种子,使每次训练结果相同
设置随机种子:
在使用PyTorch时,如果希望通过设置随机数种子,在gpu或cpu上固定每一次的训练结果,则需要在程序执行的开始处添加以下代码:
def setup_seed(seed):torch.manual_seed(seed)torch.cuda.manual_seed_all(seed)np.random.seed(seed)random.seed(seed)torch.backends.cudnn.deterministic = True
# 设置随机数种子
setup_seed(3407)
# 预处理数据以及训练模型
# ...
# ...
随机数种子seed确定时,模型的训练结果将始终保持一致。
torch.backends.cudnn.benchmark = False,torch.backends.cudnn.deterministic = True是否要这样设置?
首先种子是不是都设置了?可以参考这里pytorch reproducibility把种子都给设置了。
种子没问题后,假如结果还是不一样可能是torch.backends.cudnn.benchmark的问题。这是python调用cudnn来加速卷积的一个机制。假如你设置这个为True的话。然后你的code出现一些地方使得这个机制被不停触发的话,可能就会导致结果不一样。我试过一个batch的loss会有小数点后第5位的差距。它被触发后,会重新判断如何卷积最快,这个时候会使用不同的卷积方式,这样计算出来的卷积结果会有很细微的不同。但是经过很多batch,epoch的累积,最后结果就会相去甚远,1,2%不是问题。
这个时候解决方法是将torch.backends.cudnn.benchmark = False,
然后直接加一句torch.backends.cudnn.deterministic = True。虽然在pytorch源码torch.backends.cudnn.benchmark ?!里面,假如deterministic设置为True即使benchmark也为True还是会返回默认的卷积算法。(但是亲测,两个都设置为True的情况下,无法固定训练结果,所以必须benchmark设置为False,deterministic设置为True)。在一般情况下,这样设置后,就失去了加速的效果,可能导致程序运行变慢。但是在某些情况下,上面这种设置可能训练速度会更快,
原因是torch.backends.cudnn.benchmark = True后(在torch.backends.cudnn.deterministic没有设置,或者为False)的情况下,出现了某些因素使得这个机制不停被触发,而每次触发都会导致有一个耗时的优化搜索时间。
想要最终解决这个问题是找一下代码中哪些因素导致了这个机制被不停地触发。因为一般情况下,即网络卷积架构不会在运行的时候改变,输入的B,C,H,W不会不停改变,这个机制只会在最开始的时候触发一次。所以训练过程是确定的,训练结果不会改变。所以问题可能出现在代码输入上面,
- 比如batch_size改变(边训练边验证,batchsize大小不一样; dataloader加载最后一个batch的时候数量不足batch_size个<可使用drop_last=True来避免>)等等都会触发重新优化。
- 还有一种可能性,假如你在不同平台上,或者不同GPU,CPU上跑模型的话,那么就算前面的benchmark、deterministic、种子全部都设置对了的话都会导致训练结果不同。因为pytorch是基于CUDA API的,CUDA在不同设备上的伪随机数生成器不会是完全一样的,这是由设备决定的。
- 最后一种可能性是使用了一些CUDA本来就不会产生确定性结果的操作,如AtomicAdd、上采样(torch.nn.Upsample,Unet中常用到)等。较新版本的pytorch现在支持对这种操作的检查,只需要在代码中加入一行torch.use_deterministic_algorithms(True)。这句话相当于自检,只要使用了不可复现的运算操作,代码就会自动报错。
链接:https://www.zhihu.com/question/345043149/answer/1160114523
其实我觉得如果你的网络卷积架构不总是改变的话,输入的B,C,H,W不会不停改变,这个机制只会在最开始的时候触发一次,损失的精度几乎为0,我们为了加速训练,只设置一个torch.backends.cudnn.benchmark = True就可以了,而不需要torch.backends.cudnn.benchmark = False +torch.backends.cudnn.deterministic = True
所以随机种子的代码为:
# ######### Set Seeds ###########
random.seed(3407)
np.random.seed(3407)
torch.manual_seed(3407)
torch.cuda.manual_seed_all(3407)
为什么要将随机种子设置为3407?看以下链接
https://mp.weixin.qq.com/s/bxspzdoHQlAtKeKJqcP_FA
pytorch用同一个随机种子,使每次训练结果相同相关推荐
- Pytorch(6)-设置随机种子,复现模型结果
设置随机种子,复现模型结果 1.Python本身的随机因素 2.numpy随机因素 3.pytorch随机因素 在很多情况下,我们希望能够复现实验的结果.为了消除程序中随机因素的影响,我们需要将随机数 ...
- 【冰糖Python】PyTorch:设置随机种子
为了保证基于 PyTorch 的模型的可再现性,需要设定随机种子 但问题关键还是在于,如果知道随机性来自哪里,设置对应的随机种子即可 比如使用了 numpy.random,则应设置 numpy.ra ...
- Pytorch设置随机种子
一.网上方法 # 定义一个可以设置随机种子的函数 def setup_seed(seed):torch.manual_seed(seed)torch.cuda.manual_seed_all(seed ...
- python中随机种子_Pytorch随机种子
最近在做比赛的时候,遇到了一个最好结果,但是之后无论怎样都复现不出来最好结果了.猜测是不是跟Pytorch中的随机种子有关. 训练过程 在训练过程中,若相同的数据数据集,相同的训练集.测试集划分方式, ...
- Pytorch固定随机种子复现模型
官网 Reproducibility - PyTorch 1.11.0 documentation 在神经网络中,参数默认是进行随机初始化的.不同的初始化参数往往会导致模型的训练结果会存在一定的差异. ...
- 让炼丹更玄学!苏大博士生用「天干地支」生成随机种子,项目已开源
视学算法报道 编辑:好困 袁榭 [新智元导读]为了顺利炼出模型,搞AI的朋友们真的是什么路子都想过. 机器学习,俗称「炼丹」. 作为AI「黑魔法」的一种,再加点「玄学」又会如何? 最近,有位来 ...
- 深度学习中的随机种子
''' 深度学习代码中的随机种子 深度学习网络模型中初始的权值参数通常都是初始化成随机数 而使用梯度下降法最终得到的局部最优解对于初始位置点的选择很敏感 为了能够完全复现作者的开源深度学习代码,随机种 ...
- python随机密码生成以整数17为随机数种子_简述pythonpytorch 随机种子的实现
随机数广泛应用在科学研究, 但是计算机无法产生真正的随机数, 一般成为伪随机数. 它的产生过程: 给定一个随机种子(一个正整数), 根据随机算法和种子产生随机序列. 给定相同的随机种子, 计算机产生的 ...
- python随机种子的作用_简述pythonpytorch 随机种子的实现
随机数广泛应用在科学研究, 但是计算机无法产生真正的随机数, 一般成为伪随机数. 它的产生过程: 给定一个随机种子(一个正整数), 根据随机算法和种子产生随机序列. 给定相同的随机种子, 计算机产生的 ...
最新文章
- ASP .NET Core Web MVC系列教程一:创建一个Web应用程序
- 群同态基本定理证明_近世代数(3)——群的基本性质
- 计算机网络-信道的极限容量
- Spring - Java/J2EE Application Framework 应用框架 第 18 章 使用Quartz或Timer完成时序调度工作
- P2761 软件补丁问题
- 【读书笔记】.Net并行编程高级教程--Parallel
- mysql联合索引数据库查询数据会变慢_如何定位并优化慢查询SQL以及联合索引和索引多的弊端...
- Win10强制更新怎么关闭 彻底禁止Windows自动更新
- 使用 ONNX 模型做预测
- Web应用中避免Form重复提交的三种方案
- 用淘宝Fourinone实现Hadoop经典实例wordcount
- 面试官:jwt 是什么?java-jwt 呢?懵逼了。。
- getline基本用途
- DL_C1_week4_2(build a deep neural network 2)
- JAVA_WEB程序设计教程 pdf
- 【Paper】英文文章图表规范和文献引用格式
- macOS Command - otool
- 13. 如何打破白天开会、晚上加班的节奏
- MySQL联合主键解释
- 零基础做一个微信答题小程序(二)