pytorch中的Variable——反向传播必备
程序员文章站
2022-05-28 23:48:10
...
什么是Variable?
- 在pytorch中tensor是tensor的数据格式,variable是variable的数据格式,那tensor和variable有什么区别呢?
- variable是tensor的封装,其实variable也是tensor生成的(tensor是variable他爸)。
- 在神经网络中,常需要反向传播这些的,所以需要各个节点是连接在一起的,是个计算图。
- tensor的数据格式就好比星星之火,但是无法汇聚一起;等变成variable之后就可以慢慢燎原了。
Variable有三个技能(属性):
-
一技能:
- .data: 从variable中获得tensor本身
-
二技能:
- .grad: 获得tensor的梯度(导数)
-
三技能:
- .grad_fn:告诉你这个variable是通过什么方式获得的
生成tensor和Variable
import torch
from torch.autograd import Variable
# 生成tensor
get_tensor = torch.FloatTensor([[1,2], [3,4]])
print("tensor:", get_tensor, "|", "数据类型:", get_tensor.type())
# 由tensor转到Variable
variable = Variable(get_tensor, requires_grad=True)
print("Variable:", variable, "|", "数据类型:", variable.type())
分别用tensor和variable进行计算(接着上面代码进行)
# 比较一下计算
tensor_result = torch.mean(get_tensor*get_tensor)
print("tensor的均值:", tensor_result)
variable_result = torch.mean(variable*variable)
print("variable的均值", variable_result)
-----------------前两段代码似乎没发现tensor和variable有什么不同-----------------------
牢记:
-
上面说了Variable是可以燎原的,因为variable正在背后默默搭建计算图
-
那么所谓的计算图是什么呢?(比如神经网络中可以将一个个结点连接起来,用来反向传播计算误差)
-
variable可以一次性将所有的variable里面修改的梯度都计算出来,tensor只是孤立的
用反向传播计算误差(接着上面代码进行)
# 反向传播
variable_result.backward()
print("初始variable的梯度(导数):", variable.grad)
梯度计算过程:
variable_result =
(var iable) var iable
推荐阅读