Pytorch之Variable的用法


Posted in Python onDecember 31, 2019

1.简介

torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现

Variable和tensor的区别和联系

Variable是篮子,而tensor是鸡蛋,鸡蛋应该放在篮子里才能方便拿走(定义variable时一个参数就是tensor)

Variable这个篮子里除了装了tensor外还有requires_grad参数,表示是否需要对其求导,默认为False

Variable这个篮子呢,自身有一些属性

比如grad,梯度variable.grad是d(y)/d(variable)保存的是变量y对variable变量的梯度值,如果requires_grad参数为False,所以variable.grad返回值为None,如果为True,返回值就为对variable的梯度值

比如grad_fn,对于用户自己创建的变量(Variable())grad_fn是为none的,也就是不能调用backward函数,但对于由计算生成的变量,如果存在一个生成中间变量的requires_grad为true,那其的grad_fn不为none,反则为none

比如data,这个就很简单,这个属性就是装的鸡蛋(tensor)

Varibale包含三个属性:

data:存储了Tensor,是本体的数据 grad:保存了data的梯度,本事是个Variable而非Tensor,与data形状一致 grad_fn:指向Function对象,用于反向传播的梯度计算之用

代码1

import numpy as np
import torch
from torch.autograd import Variable
 
x = Variable(torch.ones(2,2),requires_grad = False)
temp = Variable(torch.zeros(2,2),requires_grad = True)
 
y = x + temp + 2
y = y.mean() #求平均数
 
y.backward() #反向传递函数,用于求y对前面的变量(x)的梯度
print(x.grad) # d(y)/d(x)

输出1

none

(因为requires_grad=False)

代码2

import numpy as np
import torch
from torch.autograd import Variable
 
x = Variable(torch.ones(2,2),requires_grad = False)
temp = Variable(torch.zeros(2,2),requires_grad = True)
 
 
y = x + temp + 2
y = y.mean() #求平均数
 
y.backward() #反向传递函数,用于求y对前面的变量(x)的梯度
print(temp.grad) # d(y)/d(temp)

输出2

tensor([[0.2500, 0.2500],
[0.2500, 0.2500]])

代码3

import numpy as np
import torch
from torch.autograd import Variable
 
x = Variable(torch.ones(2,2),requires_grad = False)
temp = Variable(torch.zeros(2,2),requires_grad = True)
 
 
y = x + 2
y = y.mean() #求平均数
 
y.backward() #反向传递函数,用于求y对前面的变量(x)的梯度
print(x.grad) # d(y)/d(x)

输出3

Traceback (most recent call last):
File "path", line 12, in <module>
y.backward()

(报错了,因为生成变量y的中间变量只有x,而x的requires_grad是False,所以y的grad_fn是none)

代码4

import numpy as np
import torch
from torch.autograd import Variable
 
x = Variable(torch.ones(2,2),requires_grad = False)
temp = Variable(torch.zeros(2,2),requires_grad = True)
 
 
y = x + 2
y = y.mean() #求平均数
 
#y.backward() #反向传递函数,用于求y对前面的变量(x)的梯度
print(y.grad_fn) # d(y)/d(x)

输出4

none

2.grad属性

在每次backward后,grad值是会累加的,所以利用BP算法,每次迭代是需要将grad清零的。

x.grad.data.zero_()

(in-place操作需要加上_,即zero_)

以上这篇Pytorch之Variable的用法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中optparse模块使用浅析
Jan 01 Python
Python global全局变量函数详解
Sep 18 Python
Python生命游戏实现原理及过程解析(附源代码)
Aug 01 Python
pycharm配置git(图文教程)
Aug 16 Python
基于django传递数据到后端的例子
Aug 16 Python
解决python web项目意外关闭,但占用端口的问题
Dec 17 Python
Python文件操作函数用法实例详解
Dec 24 Python
如何理解python中数字列表
May 29 Python
Python常用库Numpy进行矩阵运算详解
Jul 21 Python
如何以Winsows Service方式运行JupyterLab
Aug 30 Python
python 实现简易的记事本
Nov 30 Python
Python datetime模块的使用示例
Feb 02 Python
Pytorch 多块GPU的使用详解
Dec 31 #Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 #Python
pytorch sampler对数据进行采样的实现
Dec 31 #Python
关于pytorch处理类别不平衡的问题
Dec 31 #Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 #Python
浅析Django中关于session的使用
Dec 30 #Python
使用pickle存储数据dump 和 load实例讲解
Dec 30 #Python
You might like
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
2012/11/01 PHP
深入PHP FTP类的详解
2013/06/13 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
jquery文本框中的事件应用以输入邮箱为例
2014/05/06 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
JavaScript中使用document.write向页面输出内容实例
2014/10/16 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
JavaScript学习笔记之惰性函数示例详解
2017/08/27 Javascript
基于js中this和event 的区别(详解)
2017/10/24 Javascript
微信小程序promsie.all和promise顺序执行
2017/10/27 Javascript
微信小程序仿朋友圈发布动态功能
2018/07/15 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
NodeJs 模仿SIP话机注册的方法
2019/06/21 NodeJs
js实现图片上传到服务器和回显
2020/01/19 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
跟老齐学Python之正规地说一句话
2014/09/28 Python
Python 检查数组元素是否存在类似PHP isset()方法
2014/10/14 Python
Python 性能优化技巧总结
2016/11/01 Python
深入理解python中的select模块
2017/04/23 Python
Pandas之Dropna滤除缺失数据的实现方法
2019/06/25 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
详解Python 函数参数的拆解
2020/09/02 Python
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
文秘大学生求职信
2014/02/25 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
十岁生日答谢词
2015/01/05 职场文书
会计工作能力自我评价
2015/03/05 职场文书
工作自我评价范文
2015/03/05 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
python读取并查看npz/npy文件数据以及数据显示方法
2022/04/14 Python