PyTorch torch随机

2025-07-02 11:30 更新

PyTorch 随机数生成详解:从基础到进阶

一、PyTorch 随机数生成简介

在深度学习中,随机数生成是一个重要的环节,尤其是在模型训练和数据预处理过程中。PyTorch 提供了丰富的随机数生成函数,可以帮助我们控制随机数生成过程,确保实验的可重复性。本教程将深入浅出地讲解 PyTorch 中的随机数生成函数,并提供实际的代码示例,帮助您轻松掌握这些函数的使用。

二、PyTorch 随机数生成函数详解

(一)torch.random.manual_seed(seed)

这个函数用于设置随机数生成的种子。通过设定一个固定的种子值,可以确保每次运行代码时生成的随机数序列相同,从而保证实验结果的可重复性。

参数说明

  • seedpython:int):所需的种子值。

示例代码

import torch


## 设置随机种子
torch.random.manual_seed(42)


## 生成随机数
random_tensor = torch.rand(3, 3)
print(random_tensor)

(二)torch.random.seed()

torch.random.seed() 函数将随机数生成的种子设置为一个不确定的随机数。这通常用于希望每次运行代码时都生成不同的随机数序列的场景。

返回值

返回用于播种 RNG 的 64 位数字。

(三)torch.random.initial_seed()

这个函数返回用于生成随机数的初始种子。这个种子是在 PyTorch 初始化时设置的默认种子。

返回值

返回一个 Python long 类型的值,表示初始种子。

(四)torch.random.get_rng_state()

torch.random.get_rng_state() 函数以 torch.ByteTensor 的形式返回随机数生成器(RNG)的状态。这个状态包含了生成随机数序列所需的所有信息。

返回值

返回一个 torch.ByteTensor,表示 RNG 的当前状态。

(五)torch.random.set_rng_state(new_state)

这个函数用于设置随机数生成器的状态。通过设置 RNG 的状态,可以恢复到之前保存的状态,从而继续生成特定的随机数序列。

参数说明

  • new_statetorch.ByteTensor):所需的 RNG 状态。

(六)torch.random.fork_rng(devices=None, enabled=True)

torch.random.fork_rng() 函数分叉 RNG,以便在您返回时将 RNG 重置为之前的状态。这在需要临时改变随机数生成状态的场景中非常有用,例如在并行计算中。

参数说明

  • devices(可迭代的 CUDA ID 的列表):指定要分叉 RNG 的 CUDA 设备。CPU RNG 状态始终会被分叉。如果您的计算机上有多个设备,明确指定设备可以避免警告。
  • enabledbool):如果设置为 False,则不分叉 RNG。这在需要禁用上下文管理器时非常方便,无需删除代码并调整缩进。

示例代码

with torch.random.fork_rng(devices=[0, 1], enabled=True):
    # 在这个上下文中,RNG 被分叉
    random_tensor_in_fork = torch.rand(3, 3)
    print(random_tensor_in_fork)


## 退出上下文后,RNG 恢复到之前的状态
random_tensor_after_fork = torch.rand(3, 3)
print(random_tensor_after_fork)

三、综合示例:控制随机数生成在深度学习中的应用

(一)确保实验可重复性

在深度学习实验中,我们通常希望通过设置随机种子来确保实验的可重复性。以下是一个完整的示例,展示了如何在训练模型时控制随机数生成:

import torch
import torch.nn as nn
import torch.optim as optim


## 设置随机种子以确保可重复性
torch.random.manual_seed(42)


## 定义一个简单的模型
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.linear = nn.Linear(10, 2)


    def forward(self, x):
        return self.linear(x)


## 创建模型、优化器和损失函数
model = SimpleModel()
optimizer = optim.SGD(model.parameters(), lr=0.01)
criterion = nn.MSELoss()


## 生成随机数据
inputs = torch.randn(100, 10)
targets = torch.randn(100, 2)


## 训练模型
for epoch in range(10):
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = criterion(outputs, targets)
    loss.backward()
    optimizer.step()


    print(f"Epoch {epoch + 1}, Loss: {loss.item()}")

(二)在数据加载中使用随机数生成

在加载数据集时,我们通常会使用随机数生成来随机打乱数据顺序。以下是一个示例:

from torch.utils.data import DataLoader, TensorDataset


## 设置随机种子
torch.random.manual_seed(42)


## 创建数据集
inputs = torch.randn(100, 10)
targets = torch.randn(100, 2)
dataset = TensorDataset(inputs, targets)


## 创建数据加载器并随机打乱数据
dataloader = DataLoader(dataset, batch_size=10, shuffle=True)


## 遍历数据加载器
for batch in dataloader:
    batch_inputs, batch_targets = batch
    # 在这里进行训练步骤

四、总结与最佳实践

通过本教程,我们详细介绍了 PyTorch 中的随机数生成函数及其在深度学习中的应用。正确控制随机数生成对于确保实验的可重复性至关重要。以下是一些最佳实践建议:

  1. 在实验开始时设置随机种子(使用 torch.random.manual_seed()),以确保结果的可重复性。
  2. 如果需要临时改变随机数生成状态,可以使用 torch.random.fork_rng() 来分叉 RNG,并在完成后恢复到之前的状态。
  3. 在分布式训练或多 GPU 训练中,注意为每个设备正确设置和管理 RNG 状态,以避免随机数序列的混乱。
  4. 理解不同随机数生成函数的用途,根据实际需求选择合适的函数来控制随机性。
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号