微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设置随机种子复现Pytorch、TensorFlow结果

设置随机种子复现Pytorch、TensorFlow结果

有时候在我们的学习过程中,我们对同一个代码怎么进行比较,怎么复现别人的结果

然后我就想,因为我希望我的结果是可复现的,而不是很随机的,这样可以让人复现结果的时候更加容易,也更加方便

这里我只记录了两个框架的,其中如果利用TensorFlow作为keras后端,那和TensorFlow是一样的

Pytorch 设置随机种子

Pytorch

我们只需要在我们的代码加上这几行

torch.manual_seed(seed)            # 为cpu设置随机种子
torch.cuda.manual_seed(seed)       # 为当前GPU设置随机种子
torch.cuda.manual_seed_all(seed)   # 为所有GPU设置随机种子

Python & Numpy

但是我们有时候在我们的代码中,读取数据的过程采用了随机预处理(如RandomCrop、RandomHorizontalFlip等),那么对python、numpy的随机生成器也需要设置种子。

import random
import numpy as np
random.seed(seed)
np.random.seed(seed)

DataLoader

如果DataLoader采用了多线程(num_workers > 1), 那么由于读取数据的顺序不同,最终运行结果也会有差异。

也就是说,改变num_workers参数,也会对实验结果产生影响。

目前暂时没有发现解决这个问题的方法,但是只要固定num_workers数目(线程数)不变,基本上也能够重复实验结果。

CUDNN

cudnn中对卷积操作进行了优化,牺牲了精度来换取计算效率。如果需要保证可重复性,可以使用如下设置:

from torch.backends import cudnn
cudnn.benchmark = False            # if benchmark=True, deterministic will be False
cudnn.deterministic = True

不过实际上这个设置对精度影响不大,仅仅是小数点后几位的差别。所以如果不是对精度要求极高,其实不太建议修改,因为会使计算效率降低。

Pytoch 设置随机种子总结

def setup_seed(seed):
    torch.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)
    torch.cuda.manual_seed(seed)
    np.random.seed(seed)
    random.seed(seed)
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.enabled = False
    torch.backends.cudnn.benchmark = False
    #torch.backends.cudnn.benchmark = True #for accelerating the running
setup_seed(2021)

TensorFlow 设置随机种子

TensorFlow & numpy

TensorFlow其实和我们的pytorch差不多,首先我们都需要对我们numpy和TensorFlow进行一个随机种子的设置

import numpy as np
import tensorflow as tf
np.random.seed(2021)
tf.random.set_seed(2021)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐