前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用随机数种子来使pytorch中的结果可以复现

利用随机数种子来使pytorch中的结果可以复现

原创
作者头像
我爱自然语言处理
修改2018-06-20 15:53:26
26.6K0
修改2018-06-20 15:53:26
举报
文章被收录于专栏:我的python我的python

在神经网络中,参数默认是进行随机初始化的。不同的初始化参数往往会导致不同的结果,当得到比较好的结果时我们通常希望这个结果是可以复现的,在pytorch中,通过设置随机数种子也可以达到这么目的。

在百度如何设置随机数种子时,搜到的方法通常是:

代码语言:python
复制
SEED = 0
torch.manual_seed(SEED)
torch.cuda.manual_seed(SEED)

自己在按照这种方法尝试后进行两次训练所得到的loss和误差都不同,结果并没有复现。

也搜过一些方法,比如设置参数:

代码语言:javascript
复制
torch.backends.cudnn.deterministic = True

但是在自己的网络中这样设置并没有用,依然得到不同的结果。

后面偶然在google中搜到有人在设置随机数种子时还加上了np.random.seed(SEED),经过尝试后发现结果是可复现的了。但检查自己网络的实现发现并没有直接调用numpy来产生随机数的地方,推测可能是pytorch内部调用了numpy的一些函数。去查看了一些pytorch中关于参数初始化的代码,比如normal的初始化:

点开source查看源码:

发现是调用了tensor.normal_函数,再去文档查看这个函数发现查看不了源码:

通过这些还是没能发现pytorch和numpy除了之前众所周知的接口外的内在联系,希望在以后的学习中随着对这两个库的理解与应用的深入能够了解,届时会对这篇文章做再次更新,毕竟知其然还要知其所以然嘛~

后面补充更新:在整理代码时,发现自己在处理数据时用上了这样一行:

代码语言:python
复制
data1 = data1.sample(frac=1).reset_index(drop=True) 

当时是用来打乱数据。这里是调用的pandas里面的方法,把这行代码注释掉再把np.random.seed(SEED)注释掉发现结果可以复现。可以推断是这里的随机需要给numpy也设置随机数种子。

如果没有涉及其他随机处理的话这两行可以固定pytorch中的随机数。

代码语言:python
复制
SEED = 0
torch.manual_seed(SEED)
torch.cuda.manual_seed(SEED)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com