PyTorch中的Variable变量详解


Posted in Python onJanuary 07, 2020

一、了解Variable

顾名思义,Variable就是 变量 的意思。实质上也就是可以变化的量,区别于int变量,它是一种可以变化的变量,这正好就符合了反向传播,参数更新的属性。

具体来说,在pytorch中的Variable就是一个存放会变化值的地理位置,里面的值会不停发生片花,就像一个装鸡蛋的篮子,鸡蛋数会不断发生变化。那谁是里面的鸡蛋呢,自然就是pytorch中的tensor了。(也就是说,pytorch都是有tensor计算的,而tensor里面的参数都是Variable的形式)。如果用Variable计算的话,那返回的也是一个同类型的Variable。

【tensor 是一个多维矩阵】

用一个例子说明,Variable的定义:

import torch
from torch.autograd import Variable # torch 中 Variable 模块
tensor = torch.FloatTensor([[1,2],[3,4]])
# 把鸡蛋放到篮子里, requires_grad是参不参与误差反向传播, 要不要计算梯度
variable = Variable(tensor, requires_grad=True)
 
print(tensor)
"""
 1 2
 3 4
[torch.FloatTensor of size 2x2]
"""
 
print(variable)
"""
Variable containing:
 1 2
 3 4
[torch.FloatTensor of size 2x2]
"""

注:tensor不能反向传播,variable可以反向传播。

二、Variable求梯度

Variable计算时,它会逐渐地生成计算图。这个图就是将所有的计算节点都连接起来,最后进行误差反向传递的时候,一次性将所有Variable里面的梯度都计算出来,而tensor就没有这个能力。

v_out.backward() # 模拟 v_out 的误差反向传递

print(variable.grad) # 初始 Variable 的梯度
'''
 0.5000 1.0000
 1.5000 2.0000
'''

三、获取Variable里面的数据

直接print(Variable) 只会输出Variable形式的数据,在很多时候是用不了的。所以需要转换一下,将其变成tensor形式。

print(variable)  # Variable 形式
"""
Variable containing:
 1 2
 3 4
[torch.FloatTensor of size 2x2]
"""
 
print(variable.data) # 将variable形式转为tensor 形式
"""
 1 2
 3 4
[torch.FloatTensor of size 2x2]
"""
 
print(variable.data.numpy()) # numpy 形式
"""
[[ 1. 2.]
 [ 3. 4.]]
"""

扩展

在PyTorch中计算图的特点总结如下:

autograd根据用户对Variable的操作来构建其计算图。

1、requires_grad

variable默认是不需要被求导的,即requires_grad属性默认为False,如果某一个节点的requires_grad为True,那么所有依赖它的节点requires_grad都为True。

2、volatile

variable的volatile属性默认为False,如果某一个variable的volatile属性被设为True,那么所有依赖它的节点volatile属性都为True。volatile属性为True的节点不会求导,volatile的优先级比requires_grad高。

3、retain_graph

多次反向传播(多层监督)时,梯度是累加的。一般来说,单次反向传播后,计算图会free掉,也就是反向传播的中间缓存会被清空【这就是动态度的特点】。为进行多次反向传播需指定retain_graph=True来保存这些缓存。

4、backward()

反向传播,求解Variable的梯度。放在中间缓存中。

以上这篇PyTorch中的Variable变量详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
py2exe 编译ico图标的代码
Mar 08 Python
Python中用Ctrl+C终止多线程程序的问题解决
Mar 30 Python
Python迭代用法实例教程
Sep 08 Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
Python爬虫获取图片并下载保存至本地的实例
Jun 01 Python
Python爬虫实现验证码登录代码实例
May 10 Python
Python爬虫实现“盗取”微信好友信息的方法分析
Sep 16 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
python游戏开发的五个案例分享
Mar 09 Python
Django微信小程序后台开发教程的实现
Jun 03 Python
如何用PyPy让你的Python代码运行得更快
Dec 02 Python
python enumerate内置函数用法总结
Jan 07 #Python
pytorch加载自定义网络权重的实现
Jan 07 #Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 #Python
Pytorch 神经网络—自定义数据集上实现教程
Jan 07 #Python
浅谈Python访问MySQL的正确姿势
Jan 07 #Python
pytorch自定义二值化网络层方式
Jan 07 #Python
Pytorch: 自定义网络层实例
Jan 07 #Python
You might like
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
深入PHP许愿墙模块功能分析
2013/06/25 PHP
php递归json类实例
2014/12/02 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
js判断输入是否为数字的具体实例
2013/08/03 Javascript
jQuery实现返回顶部效果的方法
2015/05/29 Javascript
JavaScript 模块的循环加载实现方法
2015/12/13 Javascript
jQuery滚动加载图片实现原理
2015/12/14 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
基于JavaScript实现焦点图轮播效果
2017/03/27 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
Python类的动态修改的实例方法
2017/03/24 Python
查看Django和flask版本的方法
2018/05/14 Python
如何利用Anaconda配置简单的Python环境
2019/06/24 Python
Python3 解决读取中文文件txt编码的问题
2019/12/20 Python
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
Html5页面内使用JSON动画的实现
2019/01/29 HTML / CSS
用canvas显示验证码的实现
2020/04/10 HTML / CSS
Ellos丹麦:时尚和服装在线
2016/09/19 全球购物
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
ASOS亚洲:ASOS Asia
2018/03/04 全球购物
学前教育学生自荐信范文
2013/12/31 职场文书
动漫专业高职生职业生涯规划书
2014/02/15 职场文书
《绿色蝈蝈》教学反思
2014/03/02 职场文书
珍惜资源保护环境的建议书
2014/05/14 职场文书
党员对照检查剖析材料
2014/10/13 职场文书
行政撤诉申请书
2015/05/18 职场文书
HTML+CSS实现导航条下拉菜单的示例代码
2021/08/02 HTML / CSS
JAVA API 实用类 String详解
2021/10/05 Java/Android
详解Python中*args和**kwargs的使用
2022/04/07 Python
SpringBoot 集成短信和邮件 以阿里云短信服务为例
2022/04/22 Java/Android