关于variable的理解

引用莫烦大大的话来说,tensor是一个鸡蛋,而variable相当于一个篮子,把tensor装起来
其中variable有三个参数:
data:存储了Tensor,是本体的数据
grad:保存了data的梯度,本事是个Variable而非Tensor,与data形状一致
grad_fn:指向Function对象,用于反向传播的梯度计算之用

主要有三步:
第一步:创建数据

x = Variable(torch.ones(2, 2), requires_grad=False)
temp = Variable(torch.zeros(2, 2), requires_grad=True)

第二步:建立一个函数式并进行一个反向传播

y = x + temp
y.backward()  # 反向传递函数,用于求y对前面的变量(x)的梯度

第三步:
对你需要求的变量x,或者temp求梯度

print(x.grad)
print(temp.grad)

不出意外的话,这样的程序会报错

grad can be implicitly created only for scalar outputs

原因:
只有对标量输出它才会计算梯度,而求一个矩阵对另一矩阵的导数束手无策。
在这里插入图片描述
此时的z与x都是矩阵,所以对其求梯度就会报错
解决办法,将z求和转换成标量
在这里插入图片描述
所以第二步可以改变为:

y = x + temp
y = y.sum()

补充:
目前深度学习的框架大部分基于计算图谱,一张图可以看成一张有向无环图,图中的节点分为不同几种,其中一种就是variable,它是存放神经网络参数的东西,并且神经网络优化一般都是优化类型为variable,所以我们把一个tensor作为一个神经网络的参数,首先就要变成variable,这样才能被反向传播计算并且更新到。

import torch
from torch.autograd import variable

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

print(tensor)
print(varibale)

t_out = torch.mean(tensor*tensor)#tensor的平方
v_out = torch.mean(tensor*tensor)

print(t_out)
print(v-out)

v_out.backward()  
#v_out = 1/4*sum(var*var)
#d(v_out)/d(var) = 1/4*2*variable = varible/2
print(varible.grad)
print(varibale.data)
print(varibale.data.numpy())
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值