目录
- 一、torch.manual_seed(seed)
- 二、torch.cuda.manual_seed(seed)
- [三、torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)](#三、torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False))
- [四、给大家写一个常用的自动选择电脑cuda 或者cpu 的小技巧](#四、给大家写一个常用的自动选择电脑cuda 或者cpu 的小技巧)
- 五、torch.version.cuda;torch.backends.cudnn.version();打印cuda、cudnn版本
- 六、torch.autograd.grad()自动求梯度
我就基本的解释一下吧,!
一、torch.manual_seed(seed)
功能: 用于手动设置 PyTorch 的随机数生成器的种子。当你设置了一个特定的种子后,后续所有依赖随机数生成的操作都会产生可重复的结果。
参数: seed 是一个整数,取值范围通常是 32 位整数范围(-2147483648 到 2147483647)。
示例代码如下:
python
import torch
# 设置随机种子
torch.manual_seed(42)
# 生成随机张量
tensor1 = torch.randn(2, 2)
print(tensor1)
# 再次设置相同的种子
torch.manual_seed(42)
tensor2 = torch.randn(2, 2)
print(tensor2)
# 验证两次生成的张量是否相同
print(torch.allclose(tensor1, tensor2)) # 输出 True
运行结果如下图:
(一般还有个torch.seed()但是被弃用了,因为每次都是随机的结果,在科研啥的,一般都手动指定随机数种子,)
先解释一下,什么是随机数种子:
PyTorch 中随机数种子的作用原理
随机数种子就像是随机数生成器的起始状态标识。在 PyTorch 里,随机数生成器是基于特定的算法(如 Mersenne Twister 算法)来工作的。当你设置一个随机数种子时,实际上是将随机数生成器初始化为一个特定的状态。
从这个特定状态开始,随机数生成器会按照固定的算法规则
生成一系列随机数。只要种子不变,每次从这个状态开始生成的随机数序列都是相同的。这就保证了在相同的代码和相同的种子设置下,每次运行代码时,所有依赖随机数生成的操作(如初始化模型权重、打乱数据集等)都会产生相同的结果,从而实现实验的可重复性。
例如,在神经网络训练中,我们通常会随机初始化模型的权重。如果不设置随机数种子,每次运行代码时权重的初始化值都不同,那么模型的训练结果也会有差异,不利于实验结果的对比和分析。而通过设置固定的随机数种子,我们可以确保每次运行代码时模型的初始权重是相同的,这样就可以更准确地评估不同训练参数或方法对模型性能的影响。
二、torch.cuda.manual_seed(seed)
功能: 专门为 CUDA 设备(即 GPU)设置随机数种子。如果你的代码在 GPU 上运行,使用这个函数可以确保在 GPU 上的随机操作具有可重复性。
参数: seed 同样是一个整数。
python
import torch
if torch.cuda.is_available():
# 为 CUDA 设备设置随机种子
torch.cuda.manual_seed(42)
# 在 GPU 上生成随机张量
device = torch.device("cuda")
tensor = torch.randn(2, 2).to(device)
print(tensor)

注意:没有CUDA的就别跑了,会报错的。
三、torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
功能: 生成指定形状的服从均匀分布的随机数张量,取值范围是 [0, 1)。
参数:
*size: 张量的形状,例如 (2, 3) 表示生成一个 2 行 3 列的张量。
out: 可选参数,用于指定输出张量。
dtype: 张量的数据类型。
layout: 张量的布局,一般使用默认的 torch.strided。
device: 张量存储的设备,如 'cpu' 或 'cuda'。
requires_grad: 是否需要计算梯度。
python
import torch
# 生成一个 2 行 3 列的随机张量
random_tensor = torch.rand(2, 3)
print(random_tensor)
示例结果:
四、给大家写一个常用的自动选择电脑cuda 或者cpu 的小技巧
python
import torch
# 判断 CUDA 是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")

五、torch.version.cuda;torch.backends.cudnn.version();打印cuda、cudnn版本
python
import torch
# 判断 CUDA 是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")
print(torch.cuda.is_available()) #查看是否有cuda
print(torch.backends.cudnn.is_available()) #查看是否有cudnn
print(torch.version.cuda) #打印cuda的版本
print(torch.backends.cudnn.version()) #打印cudnn的版本
我的运行结果如下:
大家如果有安装环境有问题的也可以私信我哦~
六、torch.autograd.grad()自动求梯度
torch.autograd.grad()用于求取梯度;
函数原型:
torch.autograd.grad(outputs, inputs, grad_outputs=None, retain_graph=None, create_graph=False, only_inputs=True, allow_unused=False)
outputs:
类型:Tensor 或 Tensor 列表
描述:目标张量,即需要计算梯度的张量。
inputs:
类型:Tensor 或 Tensor 列表
描述:输入张量,用于计算梯度的张量。
grad_outputs(可选):
类型:Tensor 或 Tensor 列表
描述:目标张量对应的梯度。如果outputs 是一个标量,则 grad_outputs 不需要指定;如果 outputs 是一个张量或张量列表,需要指定 grad_outputs 的形状与之对应。
retain_graph(可选,默认值:None):
类型:布尔值
描述:是否保留计算图。在默认情况下,计算图在反向传播后会被释放以节省内存。如果需要多次反向传播同一个计算图,可以设置为 True。
create_graph(可选,默认值:False):
类型:布尔值
描述:是否创建新的计算图。如果设置为 True,梯度计算将被跟踪,生成的梯度张量将保留计算图,从而允许进行高阶导数的计算。
only_inputs(可选,默认值:True):
类型:布尔值
描述:是否只计算输入张量的梯度。如果设置为 True,仅输入张量的梯度会被计算。
allow_unused(可选,默认值:False):
类型:布尔值
描述:是否允许输入张量未被使用。如果某些输入张量未被 outputs 使用,并且没有被计算梯度,则会抛出错误。如果设置为 True,这些未使用的输入张量的梯度将返回为 None。
返回值
类型:Tensor 或 Tensor 列表
返回对应输入张量的梯度。
outputs:是你希望对其进行求导的标量
python
import torch
# 创建两个张量,requires_grad=True 表示需要计算梯度
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = torch.tensor([4.0, 5.0, 6.0], requires_grad=True)
# 定义一个函数 z = x * y
z = x * y
# 使用 torch.autograd.grad() 计算梯度
grad_z_x = torch.autograd.grad(outputs=z, inputs=x, grad_outputs=torch.ones_like(z))
print("梯度 dz/dx:", grad_z_x)

后面如果还有什么用到的,我会在这继续更新...ing!