torch.manual_seed的意义为了每次得到的随机数是固定的,为了复现实验的目的

本文探讨了PyTorch中随机数生成的机制。通过使用torch.manual_seed()函数,可以确保每次运行代码时生成相同的随机数序列。若不使用该函数,每次运行将产生不同的随机数。

import torch

torch.manual_seed(1)
print(torch.rand(2))

运行这段代码会发现,每次得到的随机数是固定的。但是如果不加上torch.manual_seed这个函数调用的话,打印出来的随机数每次都不一样。当把torch.manual_seed(1)注释掉后,print(torch.rand(2))生成的随机数是每次都变化的

 

### random.seed(seed) - **作用**:`random.seed(seed)` 用于设置 Python 内置 `random` 模块的随机数生成器的种子。当设置了特定的种子后,每次运行程序时,`random` 模块生成的随机数序列都会相同。这是因为随机数生成器实际上是一个伪随机数生成器,它根据种子值按照特定的算法生成随机数序列。 - **使用场景**:在需要可复现随机数序列的场景中使用,例如在测试代码时,为了保证每次测试的随机输入是相同的,以便于调试和验证代码的正确性。以下是一个示例: ```python import random # 设置随机种子 random.seed(42) print(random.randint(0, 100)) # 每次运行结果相同 # 不设置随机种子,每次运行结果不同 print(random.randint(0, 100)) ``` - **特点**:仅影响 Python 内置 `random` 模块的随机数生成,对其他库(如 NumPy、PyTorch)的随机数生成器没有影响。 ### np.random.seed(seed) - **作用**:`np.random.seed(seed)` 用于设置 NumPy 库中随机数生成器的种子。与 `random.seed(seed)` 类似,设置种子后,NumPy 生成的随机数序列将可复现。 - **使用场景**:在使用 NumPy 进行数据分析、机器学习等任务时,如果需要可复现随机数据,就可以使用该函数。例如,在生成训练集和测试集的随机划分时: ```python import numpy as np # 设置随机种子 np.random.seed(42) data = np.random.randn(100) # 每次运行生成的随机数据相同 ``` - **特点**:仅影响 NumPy 库的随机数生成,对 Python 内置 `random` 模块和 PyTorch随机数生成器没有影响。 ### torch.manual_seed(seed) - **作用**:`torch.manual_seed(seed)` 用于设置 PyTorch 中 CPU 随机数生成器的种子,确保在 CPU 上进行的随机操作(如随机初始化模型参数、随机打乱数据等)具有可复现性。 - **使用场景**:在 PyTorch 深度学习项目中,为了保证实验结果的可复现性,通常会在代码开头设置该种子。例如: ```python import torch # 设置随机种子 torch.manual_seed(42) x = torch.randn(3, 3) # 每次运行生成的随机张量相同 ``` - **特点**:仅影响 PyTorch 在 CPU 上的随机数生成,对于 GPU 上的随机操作,还需要额外设置 `torch.cuda.manual_seed` 或 `torch.cuda.manual_seed_all`。 ### torch.cuda.manual_seed_all(seed) - **作用**:`torch.cuda.manual_seed_all(seed)` 用于设置 PyTorch 中所有 GPU 设备的随机数生成器的种子,确保在所有 GPU 上进行的随机操作具有可复现性。 - **使用场景**:当使用多 GPU 进行深度学习训练时,为了保证实验结果的可复现性,需要使用该函数。例如: ```python import torch # 设置随机种子 torch.cuda.manual_seed_all(42) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") x = torch.randn(3, 3).to(device) # 每次运行在 GPU 上生成的随机张量相同 ``` - **特点**:仅影响 PyTorch 在 GPU 上的随机数生成,对于 CPU 上的随机操作,需要使用 `torch.manual_seed` 进行设置。 ### 区别总结 - **影响范围**:`random.seed(seed)` 影响 Python 内置 `random` 模块;`np.random.seed(seed)` 影响 NumPy 库;`torch.manual_seed(seed)` 影响 PyTorch 的 CPU 随机数生成;`torch.cuda.manual_seed_all(seed)` 影响 PyTorch 的所有 GPU 设备的随机数生成。 - **使用场景**:根据具体使用的库和需要复现的随机操作来选择合适的种子设置函数。如果需要实现完全可复现的环境交互,需要同时设置所有相关库的随机种子,如示例代码中所示 [^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值