Variable & Automatic Gradient Calculation
- Tensor vs Variable
- graph and gradient
注意,在pytorch0.4中,tensor和pytorch合并了。
https://pytorch.org/blog/pytorch-0_4_0-migration-guide/
torch.Tensor 和 torch.autograd.Variable 是同一个类,更准确的说,torch.Tensor 也能像旧的Variable一样
追踪历史,进行梯度计算等。Variable 仍然正常工作,但是返回的对象是torch.Tensor,这意味着不需要在代码中使用Variable(Tensor)了。
但是此篇文章主要讲述Variable的相关知识,将在下一篇在文章中讲述pytorch0.4的具体变化
引进库
import torch
from torch.autograd import Variable
Tensor 和 Variable
Variable:
autograde.Variable是一个类,在使用tensor_variable = autograde.Variable(tensor)
后,
tensor_variable 有三个重要的属性:
- data:保存着tensor_variable 的tensor向量
- grad: 保存tensor_variable 的梯度值
- grad_fn: 保存创建tensor_variable 的函数
此外,还有一个属性requires_grad
确定tensor_variable 是否具有求导的功能。
以上Variable就是pytorch实现反向传播最核心的先决条件。
接下里来看一下Variable的具体功能:
1) 声明 declaration
x_tensor = torch.Tensor(3,4)
x_tensor
out:
-12170.8672 0.0000 -12170.8672 0.0000
0.0000 0.0000 0.0000 0.0000
-12170.9453 0.0000 -12170.9453 0.0000
[torch.FloatTensor of size 3x4]
使用Variale转换Tensor
x_variable = Variable(x_tensor)
x_variable
out:
12170.8672 0.0000 -12170.8672 0.0000
0.0000 0.0000 0.0000 0.0000
-12170.9453 0.0000 -12170.9453 0.0000
[torch.FloatTensor of size 3x4]
2)Variable的属性
.data :Variable的Tensor数据
# .data -> wrapped tensor
x_variable.data
out:
-12170.8672 0.0000 -12170.8672 0.0000
0.0000 0.0000 0.0000 0.0000
-12170.9453 0.0000 -12170.9453 0.0000
[torch.FloatTensor of size 3x4]
.grad: variable的梯度值
# .grad -> gradient of the variable
print(x_variable.grad)
out:
None
.reqires_grad: variable是否能进行梯度计算
# .requires_grad -> whether variable requres gradient
print(x_variable.requires_grad)
x_variable = Variable(x_tensor,requires_grad=True)
x_variable.requires_grad
.grad_fn: variable的创建函数
y = x_variable * 2
print(y.grad_fn)
out:
<MulBackward object at 0x0000012641CF6F98>
3. Graph & Variables
先看一个简单的计算图的例子:
可以简单的计算出w的梯度是x,也就是2,其余x,b的同样的可以简单计算出。
w = Variable(torch.Tensor(