PyTorch 变量,本文要讲的一个概念就是Variable,也就是变量,这个在numpy里面是没有的,是神经网络计算图里特有的一个概念,就是Variable提供了自动求导的功能,之前如果了解Tensorflow的读者应该清楚神经网络在做运算的时候需要先构造一个计算图谱,然后在里面运行前向传播和反向传播。
Variable和Tensor本质上没有区别,不过Variable会被放入一个计算图中,然后进行前向传播,反向传播,自动求导。
首先Variable是在torch.autograd.Variable
中,要将一个tensor变成Variable也非常简单,比如想让一个tensor a变成Variable,只需要Variable(a)
就可以了。Variable
的属性如下:
Variable 有三个比较重要的组成属性:data
、grad
和grad_fn
。通过data
可以取出 Variable 里面的tensor数值,grad_fn
表示的是得到这个Variable的操作。比如通过加减还是乘除来得到的,最后grad
是这个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)
# Build a computational graph.
y = w * x + b # y = 2 * x + b
# Compute gradients
y.backward() #same as y.backward(torch.FloatTensor([1]))
# Print out the gradients.
print(x.grad) # x.grad = 2
print(w.grad) # x.grad = 1
print(b.grad) # x.grad = 1
输出结果如下:
构建Variable,要注意得传入一个参数requires_grad=True
,这个参数表示是否对这个变量求梯度,默认的是False
,也就是不对这个变量求梯度,这里我们希望得到这些变量的梯度,所以需要传入这个参数。
从上面的代码中,我们注意到了一行y.backward()
,这一行代码就是所谓的自动求导,这其实等价于y.backward(torch.FloatTensor([1]))
,只不过对于标量求导里面的参数就可以不写了,自动求导不需要你再去明确地写明哪个函数对哪个函数求导,直接通过这行代码就能对所有的需要梯度的变量进行求导,得到它们的梯度,然后通过x.grad
可以得到x的梯度。
上面是标量的求导,同时也可以做矩阵求导,比如:
import torch
from torch.autograd import Variable
x = torch.randn(3)
x = Variable(x, requires_grad=True)
y = x * 3
print(y)
y.backward(torch.FloatTensor([1, 0.1, 0.01]))
print(x.grad)
输出结果如下:
相当于给出了一个三维向量去做运算,这时候得到的结果y就是一个向量,这里对这个向量求导就不能直接写成y.backward()
,这样程序就会报错的。这个时候需要传入参数声明,比如y.backward(troch.FloatTensor([1, 1, 1]))
,这样得到的结果就是它们每个分量的梯度,或者可以传入y.backward(torch.FloatTensor([1, 0.1, 0.01]))
,这样得到的梯度就是它们原本的梯度分别乘上1, 0.1 和 0.01。
极客教程相关文章推荐,欢迎阅读!
PyTorch 张量(Tensor)
PyTorch 环境搭建
Cuda和Cudnn 安装教程
Anaconda 安装教程
PyTorch 是什么