pytorch与数学基础
pytorch中5种随机抽样函数
-
torch.seed
用于生成不确定的随机数,返回一个64位的数值 -
torch.manual_seed(seed)
设定生成随机数的种子,并返回一个torch.Generator对象。(torch.Generator是PyTorch中的一个对象,用于管理随机数生成)
参数:种子seed为int类型或long类型
(long是一种数据类型,主要用于存储大的整数。long类型的整数的大小比标准的int类型的整数更大。) -
torch.initial_seed()
返回生成随机数的原始种子值
import torch
# 设置一个种子值
torch.manual_seed(123)
# 输出初始种子
print(torch.initial_seed()) # 输出:123
- torch.get_rng_state()
返回随机生成器状态(Byte Tensor)
torch.get_rng_state()
# 输出:tensor([12, 0, 0, ..., 0, 0, 0], dtype=torch.uint8)
- torch.set_rng_state(new_state)
设定随机生成器状态
参数:new_state是期望的状态
rng_state1 = torch.get_rng_state()
print(rng_state1)
torch.set_rng_state(rng_state1*2)
rng_state2 = torch.get_rng_state()
print(rng_state2)
# 输出: tensor([12, 0, 0, ..., 0, 0, 0], dtype=torch.uint8)
tensor([24, 0, 0, ..., 0, 0, 0], dtype=torch.uint8)
import torch
# 创建一个生成器并设置一个种子
g = torch.Generator()
g.manual_seed(42)
# 获取生成器的状态
state = g.get_state()
# 在其他地方,你可以设置生成器的状态来复现同样的随机序列
g_other = torch.Generator()
g_other.set_state(state)
# 现在,g和g_other将生成相同的随机序列
注:pytorch中生成器的状态和种子的区别
种子(Seed):种子是初始化随机数生成器的一个值。给定相同的种子,随机数生成器将会产生相同的随机数序列。这在需要复现实验结果的情况下非常有用。比如可以使用torch.manual_seed(seed)
函数来设置全局种子,或者使用torch.Generator().manual_seed(seed)
为特定的生成器设置种子。
生成器的状态(Generator state):生成器的状态是一个包含了当前随机数生成器所有信息的对象,这些信息包括种子以及其他内部状态值,比如已经生成的随机数的数量等。你可以使用torch.Generator().get_state()
方法获取当前的状态,使用torch.Generator().set_state(state)
方法设置当前的状态。
因此,种子是决定随机序列开始的一个数值,而生成器的状态则包含了更多的信息,比如生成器已经生成了多少个随机数,下一个将要生成的随机数是什么等。通过设置和获取生成器的状态,你可以精确地控制随机序列的生成过程,而不仅仅是它开始的位置。
pytorch自动微分
PyTorch中自动求导模块中的相关函数有torch.autograd.backward()和torch.autograd.grad()。下面逐一进行介绍。
- torch.autograd.backward()该函数实现自动求取梯度
torch.autograd.backward(tensors,
# Tensors:用于求导的张量,如loss。
grad_tensors=None,
# grad_tensors:多梯度权重,当有多个loss需要计算梯度时,需要设置每个loss的权值。
retain_graph=None,
# retain_graph:保存计算图,由于PyTorch采用动态图机制,在每次反向传播之后计算图都会释放掉,如果还想继续使用,就要设置此参数为True。
create_graph=False)
# create_graph:创建导数计算图,用于高阶求导
案例1:
import torch
w = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)
a = torch.add(x, w)
b = torch.add(w, 1)
y = torch.mul(a, b)
# y = (x+w)*(w+1) = xw + x + w^2 + w
y.backward()
print(w.grad)#对w求导 = x + 2w + 1 = 5
# 输出:tensor([5.])
案例2:
import torch
w = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)
a = torch.add(x, w)
b = torch.add(w, 1)
y0 = torch.mul(a, b)
# y0 = (x+w)*(w+1