torch.manual_seed() 和 torch.cuda.manual_seed() 功能及实例

本文介绍如何在PyTorch中设置随机数种子,确保每次运行生成相同的随机数,适用于CPU和GPU环境。通过设置torch.manual_seed和torch.cuda.manual_seed,实现实验结果的可复现性。
部署运行你感兴趣的模型镜像

功能

  • 设置固定生成随机数的种子,使得每次运行该 .py 文件时生成的随机数相同

设置方法

  • CPU:torch.manual_seed(整数)
    • 官方文档:https://pytorch.org/docs/stable/torch.html?highlight=manual_seed#torch.manual_seed
  • GPU:torch.cuda.manual_seed(整数)
    • 官方文档:https://pytorch.org/docs/stable/cuda.html?highlight=manual_seed#torch.cuda.manual_seed

实例

# 需要注意不要在终端中单行敲入运行如下代码,要将如下代码先拷贝到 *.py 文件中,再在终端命令中通过 python *.py 运行

import torch

if torch.cuda.is_available():
    print("gpu cuda is available!")
    torch.cuda.manual_seed(1000)
else:
    print("cuda is not available! cpu is available!")
    torch.manual_seed(1000)

print(torch.rand(1, 2))

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

# 0801new 模型搭建改用pytorch 0/3 固定随机数保证结果复现(注意0/3执行后单独重复执行1/3 2/3 3/3会导致结果无法固定/复现,每次执行前都要set_seed) import torch import numpy as np import random def set_seed(seed): # PyTorch torch.manual_seed(seed) torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed) # 多GPU时需设置 # NumPyPython随机库 np.random.seed(seed) random.seed(seed) # 启用确定性算法(可能降低性能) torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False # 关闭自动优化 myseed = 1812189 set_seed(myseed) # 设置种子 # 0801new 模型搭建改用pytorch 1/3 import torch import torch.nn as nn input_len = len(aggregate_Xdata[0]) # 采用组合样本的输入 output_len = 1 EPOCHS = 50 # 版本1 早期keras实现不同 class bpnet(nn.Module): def __init__(self, input_len: int, output_len: int): super().__init__() self.net = nn.Sequential( nn.Linear(input_len, 32), nn.ReLU(), nn.Linear(32, 16), nn.ReLU(), nn.Linear(16, output_len) ) def forward(self, x): return self.net(x) # model.load_state_dict(state_dict) # 0801new 模型改用pytorch 2/3 from torch.utils.data import DataLoader, TensorDataset X_train = aggregate_Xdata # 不再沿用keras的拆分 Y_train = Ydata X_train = X_train.astype(np.float32) # 输入数据 Y_train = Y_train.astype(np.float32) # 标签数据 X_train_tensor = torch.from_numpy(X_train) Y_train_tensor = torch.from_numpy(Y_train) dataset_tensor = TensorDataset(X_train_tensor, Y_train_tensor) g = torch.Generator() g.manual_seed(myseed) train_loader = DataLoader(dataset_tensor, batch_size=8, shuffle=True, num_workers=0, generator=g) X_test=aggregate_X_verify Y_test=Y_verify X_test = X_test.astype(np.float32) # 输入数据 Y_test = Y_test.astype(np.float32) # 标签数据 X_test_tensor = torch.from_numpy(X_test) Y_test_tensor = torch.from_numpy(Y_test) val_dataset = TensorDataset(X_test_tensor, Y_test_tensor) val_loader = DataLoader(val_dataset, batch_size=8, num_workers=0) # 建立模型 model = bpnet(input_len, output_len) criterion =nn.L1Loss() optimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01) model.train() training_loss = np.zeros(EPOCHS) testing_loss = np.zeros(EPOCHS) for epoch in range(EPOCHS): model.train() epoch_loss = 0.0 for data, target in train_loader: optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() epoch_loss += loss.item() * data.size(0) training_loss[epoch] = epoch_loss / len(train_loader.dataset) model.eval() # 切换评估模式 val_loss = 0.0 # for module in model.modules(): # if isinstance(module, torch.nn.BatchNorm1d) or isinstance(module, torch.nn.BatchNorm2d): # module.track_running_stats = False with torch.no_grad(): # 禁用梯度计算 for val_data, val_target in val_loader: val_output = model(val_data) v_loss = criterion(val_output, val_target) val_loss += v_loss.item() * val_data.size(0) # 记录验证损失(按样本数平均) testing_loss[epoch] = val_loss / len(val_loader.dataset) # print(f"Epoch {epoch+1}/{EPOCHS} | Train_Loss: {epoch_loss / len(train_loader.dataset):.4f}") print(f"Epoch {epoch+1}/{EPOCHS} | Train_Loss: {epoch_loss / len(train_loader.dataset):.4f}| Test_Loss: {val_loss / len(val_loader.dataset):.4f}") # for module in model.modules(): # if isinstance(module, torch.nn.BatchNorm1d) or isinstance(module, torch.nn.BatchNorm2d): # module.track_running_stats = True 逐行分析代码含义语法功能
10-07
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdn-WJW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值