【PyTorch】随机种子 与 网络初始化

设置随即种子

使用pytorch_lightning下的seed_everything方法。
若调用GPU,有时还不够,还需排除cudnn加速的随机性。

from pytorch_lightning import seed_everything

seed_everything(0)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

网络初始化

可以用如下代码进行网络参数初始化

class My_CNN(nn.Module):
    def __init__(self):
        super(My_CNN, self).__init__()

        self.tmp1 = nn.Linear(4 * 4 * 64, 512)
        self.tmp2 = nn.Conv2d(32, 32, 3)
        self.tmp3 = nn.BatchNorm2d(64)
        ...

        for m in self.children():
            if isinstance(m, nn.Linear):
                print("init linear.")
                nn.init.normal_(m.weight, 0, 0.02)
                nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.Conv2d):
                print("init conv.")
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
                nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.BatchNorm2d):
                print("init batchnorm2d.")
                nn.init.normal_(m.weight, 1, 0.02)
                nn.init.constant_(m.bias, 0)
            ...

但套在nn.Sequential()内的网络参数不会被初始化,如下所示:

self.conv1 = nn.Sequential(
	             	nn.Conv2d(1, 32, 3),
		           	nn.BatchNorm2d(32),
		           	nn.ReLU()
             )

这种需要手动对Sequential()内的网络进行初始化。

参考资料:

  1. https://blog.csdn.net/qq_41917697/article/details/115042465
  2. https://zhuanlan.zhihu.com/p/97651850
### 如何在 PyTorch 中设置和固定随机种子 为了确保实验的可复现性,在 PyTorch 中可以通过多种方式来控制随机性的来源。以下是详细的说明: #### 1. 控制 Python 的内置随机数生成器 通过 `random.seed(seed)` 来设定全局随机种子,这会影响 Python 基础环境中所有的随机操作[^3]。 ```python import random seed = 42 random.seed(seed) ``` #### 2. 控制 Numpy 的随机数生成器 如果项目中涉及 Numpy 库的操作,则需要显式调用 `np.random.seed(seed)` 来固定其随机行为。这样可以保证所有基于 Numpy 的随机过程一致。 ```python import numpy as np np.random.seed(seed) ``` #### 3. 控制 PyTorch随机数生成器 对于 PyTorch 自身的随机化部分,需使用 `torch.manual_seed(seed)` 和 `torch.cuda.manual_seed_all(seed)` 方法分别针对 CPU 和 GPU 进行初始化。 ```python import torch torch.manual_seed(seed) # 设定CPU上的随机种子 torch.cuda.manual_seed_all(seed) # 如果有多个GPU设备,也需要单独处理它们各自的随机状态 ``` #### 4. 关闭 cuDNN 加速优化选项 当运行模型时启用了 NVIDIA 提供的 cuDNN 支持,默认情况下它会选择性能最优但可能不可预测的具体卷积算法实现路径。因此建议关闭自动选择功能并强制指定确定版本的计算方法以达到完全重现的目的。 ```python torch.backends.cudnn.benchmark = False # 禁用CuDNN加速模式下的动态调整策略 torch.backends.cudnn.deterministic = True # 使用固定的cuDNN算法而非自适应最佳方案 ``` 即使完成了上述配置仍有可能遇到无法预期的结果差异情况发生,比如某些第三方扩展包内部存在未受控因素或者硬件层面固有的不确定性等问题都会影响最终输出的一致程度[^1]。此时应该仔细排查是否存在其他潜在干扰项,并尽可能减少外部依赖引入额外变化空间的可能性。 综上所述,按照以上步骤逐一完成相应参数调节之后基本能够满足大多数场景下关于再现能力的需求标准。 ```python def set_random_seeds(seed=42): import os import random import numpy as np import torch # Set python hash seed to fixed value. os.environ['PYTHONHASHSEED'] = str(seed) # Seed the global generators used by libraries like NumPy and standard library 'random'. random.seed(seed) np.random.seed(seed) # Torch seeds must be set separately for both CPU/GPU operations. torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed) # Disable cudnn auto-tuning features that may cause non-determinism. torch.backends.cudnn.enabled = False torch.backends.cudnn.benchmark = False torch.backends.cudnn.deterministic = True ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值