【深度学习】torch消除模型训练的随机性,使结果可复现

目录

背景

方法

1、设置随机种子

2、消除Python与Numpy的随机性

3、消除torch的随机性

4、消除DataLoader的随机性


背景

现有的深度学习框架存在一定的随机性,在复现论文、验证模块有效性,SOTA实验时有很大的干扰,在之前的实验中,我所遇到的因随机性产生的模型准确率的差距可达10%。因此,消除随机性很有必要。

方法

1、设置随机种子

随机种子的设置可以使随机函数在当前种子下产生相同的随机数:

SEED=1234

SEED可以设置为任意值:0、666、123456等

2、消除Python与Numpy的随机性

import random
import numpy as np

random.seed(SEED)
np.random.seed(SEED)

3、消除torch的随机性

import torch
torch.manual_seed(SEED)
torch.cuda.manual_seed(SEED) # 适用于显卡训练
torch.cuda.manual_seed_all(SEED) # 适用于多显卡训练

4、消除DataLoader的随机性

在使用torch时,一般都会使用DataLoader加载数据集,这个类使用了多线程的处理方式,因此会造成一定随机性,可以使用如下方式消除:

def worker_init_fn(worker_id):
    random.seed(SEED + worker_id)

g = torch.Generator()
g.manual_seed(SEED)

DataLoader(
    train_dataset,
    batch_size=batch_size,
    num_workers=num_workers,
    worker_init_fn=worker_init_fn
    generator=g,
)

 5、消除CUDA随机性(适用于GPU训练)

from torch.backends import cudnn

cudnn.benchmark = False
cudnn.deterministic = True

6、对于分割任务,UpsamplingBilinear2D随机性bug

最近遇到的一个bug,在消除了上述所有随机性后训练结果仍然复现,折腾了半天发现是双线性插值上采样的坑,如官方文档所说:

我使用的服务器显卡是NVIDIA RTX A40 48G,cuda版本为11.1,同样的问题在另一台服务器上就没出现,可能是cuda版本的问题,解决方法是将bilinear改为了nearest,但是可能会损失一定的精度。

参考:https://pytorch.org/docs/stable/notes/randomness.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

McGregorWwww

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值