关于固定随机种子,模型每次结果也不一样的问题可能解决方法


问题描述

最近一直被“固定随机种子,模型每次结果也不一样”这个问题困扰,我的模型同样的代码每次跑的结果都不一样,而且还忽高忽低,有可能有模型本身架构不合适的问题(按理来说,即便有变动也不会差别太大),忽略掉每次结果差距较大这个问题,先来解决每次结果都不一样这个问题。


原因分析:

可以按照以下原因顺序检查模型:

1. 没有设置随机种子。

2. 虽然设置了随机种子,但随机初始化参数也会有变动。

3. 若第2中情况已检查没有问题,建议从最基础的模块开始,保证该模块每次运行是稳定的,然后一个模块一个模块的添加,考虑是在添加哪个模块后导致的。(我的模型是因为GCN的问题)


解决方案:

1. 若没有设置随机种子,请在主程序(一般是run.py)添加全局seed_torch函数,并调用。

def seed_torch(seed=0):

    random.seed(seed)

    np.random.seed(seed)

    torch.manual_seed(seed)

    torch.cuda.manual_seed(seed)

    torch.cuda.manual_seed_all(seed) 

    torch.backends.cudnn.benchmark = False

    torch.backends.cudnn.deterministic = True

 2. 若设置了随机种子,每次运行结果依旧不一样,请检查每次随机初始化参数是否一样(可以debug进行调试,下边是一个例子)。

self.linear = nn.Linear(in_features, out_features)
for name, p in self.linear.named_parameter():
    print(name, ": ", p)

3. 若上边都没有问题,考虑第3种原因,从最基础的模块开始,保证该模块每次运行是稳定的,然后一个模块一个模块的添加,考虑是在添加哪个模块后导致的(这里附上我出现的问题作为参考)。

from torch_geometric.nn import GCNConv

我的模型是因为调用这个包导致每次结果都不一样,但是我不知道怎么解决这个问题,试着设置torch_geometric.seed_everything(seed)也没有用,如果有哪位大佬有跟我有同样的问题,但是解决了,请教一下。

这里最终我解决的方式是用的别人自己写的GCN代码或者pygcn里的GCN代码,模型每次结果就一样了。

 代码:https://github.com/tkipf/pygcn/blob/master/pygcn

但是还有一个问题就是,直接调用GCNConv时可以传入边的权重,用我的这种方式还没解决添加边的权重这个问题(公式不会写)。

最后,再补充一点,同样的模型,如果删除一些无关紧要的参数或者变量可能都会影响模型的结果。

以上如有陈述不正确的地方,欢迎大家批评指正!

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值