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

什么是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 = 1 4 ∗ sum ⁡ (  variable  ∗  variable  ) = 1 4 ∗ sum ⁡ (  variable  2 ) \frac{1}{4} * \operatorname{sum}\left(\text { variable }^{*} \text { variable }\right)=\frac{1}{4} * \operatorname{sum}\left(\text { variable }^{2}\right) 41sum( variable  variable )=41sum( variable 2)

d (  variable result  ) d (  variable  ) = 1 4 ∗ 2 ∗ \frac{d(\text { variable result })}{d(\text { variable })}=\frac{1}{4} * 2 * d( variable )d( variable result )=412 (var iable) = 1 2 =\frac{1}{2} =21 var iable = 1 2 ∗ [ 1 2 3 4 ] = [ 0.5 1 1.5 2 ] =\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] =21[1324]=[0.51.512]

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值