Pytorch学习笔记系列-Variable

回顾:在上一节中介绍了tensor的基本构造方法 ---> Pytorch学习笔记系列-Torch基本操作 本节将介绍 Variable

1 什么是Variable?

通过上一节的介绍我们知道了什么是tensor,tensor是torch计算的基本结构,就相当于在Numpy中计算需要使用array格式一样。

那么Variable到底是做什么的呢?我们知道torch库中提供了很多深度学习、神经网络的方法,那么当我们在神经网络节点中使用变量时的格式就是Variable格式。除了内部的参数外,Variable几乎和tensor是一致的。

Variable可以理解为盒子,盒子里包含了tensor及对它的操作,例如当tensor作为神经网络节点时计算它的梯度。Variable 存在于 torch.autograd库中,使用时可通过如下方式进行引用:

from torch.autograd import Variable

2 Variable基本使用方法 

首先我们创建两个变量,一个为tensor变量,一个为Variable变量,并将其输出

import torch
from torch.autograd import Variable

tensor = torch.FloatTensor([[1,2],[3,4]])           
variable = Variable(tensor)

 

 观察上图可以发现当未对Variable盒子中的tensor做任何操作时,输出的tensor与variable是一致的,Variable作为盒子的好处就是不仅可以封装数据,还可以封装对其的操作,在使用时直接由盒子中取相关的材料即可。

接下来同样创建上述两个变量,不同的是此次在Variable中添加参数  requires_grad

import torch
from torch.autograd import Variable

tensor = torch.FloatTensor([[1,2],[3,4]])           
variable = Variable(tensor,requires_grad=True)

 

 

本次运行结果与未添加参数有所不同,这一次的variable变量中封装了对tensor的操作,即自动求导操作。


接下来介绍自动求导是如何完成的。

import torch
from torch.autograd import Variable

tensor = torch.FloatTensor([[1,2],[3,4]])           
variable = Variable(tensor,requires_grad=True)
 
t_out = torch.mean(tensor*tensor)       
v_out = torch.mean(variable*variable)

在上述程序的基础上新定义了两个变量,变量的实际含义:通过torch的mean函数计算tensor*tensor的平均值,若tensor 记为 x,则tensor*tensor 为 x^2 。此处两个变量的计算输出相同:

 

v_out 变量为封装了自动求导操作的变量,也就是此时v_out中不仅存储了运算好的平均值,也存储了计算好的导数值,因此输出时并不完全相同。

那么接下来使用v_out 变量调用 backward() 方法将计算的导数值进行反向传播,并打印梯度值。

v_out.backward()    

print(variable.grad)

 

下面介绍梯度的由来,v_out 中计算的是 variable*variable的平均值,将variable*variable理解为x^2,而二维张量乘法后的均值是每一个值的1/4,因此对variable的求导可以理解为 (1/4x^2)',也就是1/4*2x,即为x/2,因此计算出的梯度如上图所示结果。

附上完整代码:

import torch
from torch.autograd import Variable

tensor = torch.FloatTensor([[1,2],[3,4]])            
variable = Variable(tensor, requires_grad=True,)      

print(tensor)       
print(variable)     

t_out = torch.mean(tensor*tensor)       
v_out = torch.mean(variable*variable)   # x^2
print(t_out)
print(v_out)    # 7.5

v_out.backward()    # backpropagation from v_out

print(variable.grad)

print(variable.data)    # 访问variable中的tensor

print(variable.data.numpy())    # variable中的tensor转换为numpy中的array

 

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带鱼工作室

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值