文章目录
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