随机种子、torch.backends.cudnn.benchmark\.deterministic

本文探讨了在使用相同网络结构时,为何运行效果可能不同的原因,重点关注PyTorch框架中的随机数种子设定。通过设置`torch.backends.cudnn.deterministic=True`和`torch.backends.cudnn.benchmark=False`,可以提高结果的可复现性。同时,介绍了`torch.backends.cudnn.benchmark`的作用,它会在训练初期优化卷积算法以提高速度,但可能影响结果的重现性。确保随机种子固定是关键,包括PyTorch、CUDA以及numpy的种子设置。

为什么使用相同的网络结构,跑出来的效果完全不同,用的学习率,迭代次数,batch size 都是一样?
固定随机数种子是非常重要的。
但是如果你使用的是PyTorch等框架,还要看一下框架的种子是否固定了。还有,如果你用了cuda,别忘了cuda的随机数种子。这里还需要用到torch.backends.cudnn.deterministic和torch.backends.cudnn.benchmark确保调度的卷积算法一致

一、torch.backends.cudnn.deterministic是啥?

torch.backends.cudnn.deterministic=True每次返回的卷积算法将是确定的,即默认算法
如果配合上设置 Torch 的随机种子为固定值的话,应该可以保证每次运行网络的时候相同输入的输出是固定的,代码大致这样

def init_seeds(seed=0):
    torch.manual_seed(seed
#### 含义 - `torch.backends.cudnn.benchmark = True`:当设置为`True`时,PyTorch会在每次运行卷积层时,在多个卷积算法中自动寻找最适合当前硬件和输入数据尺寸的算法,以达到最快的运行速度。这是通过在后台运行一些基准测试来实现的,所以会在程序开始时增加一些额外的时间开销,但后续的卷积操作会更快[^1]。 - `torch.backends.cudnn.deterministic = False`:当设置为`False`时,允许CuDNN使用非确定性算法。非确定性算法可能会在相同的输入下产生稍微不同的结果,但通常会有更好的性能。相反,当设置为`True`时,CuDNN会使用确定性算法,保证每次运行的结果都是相同的。 #### 使用场景 - **`torch.backends.cudnn.benchmark = True`**:适用于输入数据的尺寸固定,且追求极致的推理或训练速度的场景。例如,在图像分类任务中,如果所有输入图像的尺寸都是固定的,开启这个选项可以显著提高模型的运行速度。在训练大规模深度学习模型时,也可以通过开启这个选项来加速训练过程。 - **`torch.backends.cudnn.deterministic = False`**:当对结果的可重复性要求不高,更注重性能时,可以将其设置为`False`。比如在模型的开发和调试阶段,或者在进行大规模的训练时,为了提高训练效率,可以牺牲一定的结果确定性。 #### 影响 - **性能方面**:`torch.backends.cudnn.benchmark = True`通常会提高卷积操作的性能,尤其是在GPU上。因为它会选择最优的算法,减少卷积操作的时间开销。而`torch.backends.cudnn.deterministic = False`允许使用非确定性算法,也可能会提高性能,但具体效果取决于硬件和算法的实现。 - **结果可重复性方面**:`torch.backends.cudnn.benchmark = True`本身不会影响结果的可重复性,但如果同时设置`torch.backends.cudnn.deterministic = False`,则会破坏结果的可重复性。也就是说,每次运行相同的代码,可能会得到稍微不同的结果。 以下是设置这两个参数的代码示例: ```python import torch # 设置benchmark为True torch.backends.cudnn.benchmark = True # 设置deterministic为False torch.backends.cudnn.deterministic = False ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值