Pytorch基础——Variable(变量)

Variable(变量)

  • 神经网络在做运算的时候,需要先构建一个计算图谱,然后在里面进行前向传播和反向传播
  • Variable本质上和Tensor(张量)没有区别,Variable会放入一个计算图中进行前向、反向传播和自动求导

对标量的求导

import torch
from torch.autograd import Variable


# create Variable
x = Variable(torch.Tensor([1]), requires_grad=True)
w = Variable(torch.Tensor([2]), requires_grad=True)
b = Variable(torch.Tensor([3]), requires_grad=True)

# 建立计算图
y = w*x +b

# 梯度
y.backward() # 自动求导
print(x.grad)
print(w.grad)
print(b.grad)

tensor([2.])
tensor([1.])
tensor([1.])

  • y.backward() 完成自动求导,不用再去明确写明哪个函数对哪个求导,直接这行代码就可以对所有需要求导的参数进行求导
  • requires_grad=True 是否这个变量求梯度
  • torch.randn(size, out=None):返回一个Tensor,包含可从标准正态分布中抽取的一组随机数的张量
  • torch.rand(size, out=None):【0, 1】区间内均匀分布的一个张量

矩阵求导

"""矩阵的求导"""
x = torch.randn(3) # 正态分布中抽取一组随机数的张量
x = Variable(x, requires_grad=True)
print(x)

# 计算图
y = x*2
print(y)

# 得到每个分量的梯度,不能直接写成y.backward(),因为一个分量有了三个参数
y.backward(torch.FloatTensor([1, 0.1, 0.01])) # 每个参数的梯度分别乘以1, 0.1, 0.01
x.grad

tensor([ 0.1820, -0.3567, -0.7565], requires_grad=True)
tensor([ 0.3641, -0.7134, -1.5129], grad_fn=)
tensor([2.0000, 0.2000, 0.0200])

  • **y.backward(torch.FloatTensor([1, 0.1, 0.01])):**不能再简化写,因为x变量的参数个数为3个,每个参数梯度结果分别乘以1, 0.1, 0.01
发布了165 篇原创文章 · 获赞 30 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44478378/article/details/104292622