欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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())

pytorch中的Variable——反向传播必备

分别用tensor和variable进行计算(接着上面代码进行)

# 比较一下计算
tensor_result = torch.mean(get_tensor*get_tensor)
print("tensor的均值:", tensor_result)
variable_result = torch.mean(variable*variable)
print("variable的均值", variable_result)

pytorch中的Variable——反向传播必备

-----------------前两段代码似乎没发现tensor和variable有什么不同-----------------------

牢记:

  • 上面说了Variable是可以燎原的,因为variable正在背后默默搭建计算图

  • 那么所谓的计算图是什么呢?(比如神经网络中可以将一个个结点连接起来,用来反向传播计算误差)

  • variable可以一次性将所有的variable里面修改的梯度都计算出来,tensor只是孤立的

用反向传播计算误差(接着上面代码进行)

# 反向传播
variable_result.backward()
print("初始variable的梯度(导数):", variable.grad)

pytorch中的Variable——反向传播必备

梯度计算过程:

variable_result = 14sum( variable  variable )=14sum( variable 2)\frac{1}{4} * \operatorname{sum}\left(\text { variable }^{*} \text { variable }\right)=\frac{1}{4} * \operatorname{sum}\left(\text { variable }^{2}\right)

d( variable result )d( variable )=142\frac{d(\text { variable result })}{d(\text { variable })}=\frac{1}{4} * 2 * (var iable) =12=\frac{1}{2} var iable =12[1234]=[0.511.52]=\frac{1}{2} *\left[\begin{array}{ll}1 & 2 \\ 3 & 4\end{array}\right]=\left[\begin{array}{ll}0.5 & 1 \\ 1.5 & 2\end{array}\right]