Variable的基本概念

autograd.Variable 是包的核心类。它包装了张量,并且支持几乎所有的操作。一旦你完成了你的计算, 就可以调用

.backward() 方法

自动计算所有的梯度

。你还可以通过

.data 属性

访问原始的张量

,而关于

该 variable(变量)的梯度

会被累计到

.grad

上去。

通俗来讲:

Variable实质上也就是可以变化的变量,在Pytorch中的Variable就是一个存放会变化值的地理位置,里面的值会不停发生变化,就像一个装鸡蛋的篮子,里边的鸡蛋数会不断发生变化,而Pytorch中的Tensor就好比是里面的鸡蛋。

也就是说,

Pytorch都是由Tensor(Tensor 是一个多维矩阵)计算的,而Tensor里面的参数都是Variable的形式。

如果用Variable计算的话,那返回的也是一个同类型的Variable。这正好就符合了反向传播,参数更新的属性。

备注:Tensor不能反向传播,Variable可以反向传播。

Variable的自动求导

Variable还有一个针对自动求导实现来说非常重要的类 - Function。

Variable 和 Function 是相互联系的, 并且它们构建了一个非循环的图,编码了一个完整的计算历史信息。 每一个 variable(变量)都有一个

.grad_fn 属性

, 它引用了一个已经创建了 Variable 的 Function。

调用

.backward()

方法——实现Variable 的自动求导

计算变量variable的导数,可以在 Variable 上调用

.backward() 方法

如果变量variable是

标量的形式

(例如, 它包含一个元素数据), 则再调用

.backward() 方法

时,不必指定任何参数;

但是,

如果变量variable是

非标量的形式

例如, 它包含更多的元素数据),则再调用

.backward() 方法

时,必须去指定一个

grad_output 参数

,该参数是一个匹配

shape(形状)

的张量。

PyTorch中Variable的使用方法

Variable一般的初始化方法,默认是不求梯度的。

import torch

from torch.autograd import Variable # 导入torch中Variable模块

x_tensor = torch.randn(2,3) # 创建2*3的张量矩阵

#将tensor转换成Variable

x = Variable(x_tensor)

print(x.requires_grad)

>>>

False

x = Variable(x_tensor,requires_grad=True) #Varibale 默认时不要求梯度的,如果要求梯度,需要说明

print(x)

>>>

tensor([[0.1163, 0.7213, 0.5636],

[1.1431, 0.8590, 0.7056]], requires_grad=True)

典型范例:

import torch

from torch.autograd import Variable # torch 中 Variable 模块

tensor = torch.FloatTensor([[1,2], [3,4]]) # 创建2*2的张量矩阵

print(tensor)

>>>

tensor([[1., 2.],

[3., 4.]])

variable = Variable(tensor, requires_grad=True) # 张量转为变量——自变量x

print(variable)

>>>

tensor([[1., 2.],

[3., 4.]], requires_grad=True)

# 定义变量y关于自变量x的函数关系

## Tensor情形

t_out = torch.mean(tensor*tensor) # 求解x^2项的均值,函数表达式:y = 1/n*sum(x1^2+...+xn^2)

print(t_out)

>>>

tensor(7.5000)

## Variable情形

v_out = torch.mean(variable*variable)

print(v_out)

>>>

tensor(7.5000, grad_fn=)

# 求解梯度

# 模拟 v_out 的误差反向传递

v_out.backward() # t_out.backward()报错,由于Tensor不能反向传播,Variable可以反向传播

print(variable.grad) # 初始 Variable 的梯度

>>>

tensor([[0.5000, 1.0000],

[1.5000, 2.0000]])

#### 梯度的计算原理:

# v_out = 1/4 * sum(variable*variable) 这是计算图中的 v_out 计算步骤

# 针对于 v_out 的梯度就是, d(v_out)/d(variable) = 1/4*2*variable = variable/2

备注:

利用Variable计算时, 它在幕后一步步默默地搭建着一个庞大的系统,叫做

计算图(computational graph)

计算图的作用

:是将所有的计算步骤 (节点) 都连接起来,最后进行误差反向传递的时候,一次性将所有 Variable 里面的修改幅度 (梯度) 都计算出来, 而 Tensor 就没有这个能力。

获取Variable里面的数据

直接

print(variable)

只会输出

Variable

形式的数据,在很多时候是用不了的(比如想要用 plt 画图), 所以我们要转换一下,将它转变成

Tensor

形式。

Variable转变为其他形式的方法:

variable

.data

——将Variable 形式转变为Tensor 形式

variable

.data.numpy()

——将Variable 形式转变为Numpy 形式

备注:variable为存放Variable 形式的变量名

典型范例:

import torch

from torch.autograd import Variable # torch 中 Variable 模块

tensor = torch.FloatTensor([[1,2], [3,4]]) # 创建2*2的张量矩阵

variable = Variable(tensor, requires_grad=True) # 张量转为变量——自变量x

print(variable) # Variable 形式

>>>

tensor([[1., 2.],

[3., 4.]], requires_grad=True)

print(variable.data) # tensor 形式

>>>

tensor([[1., 2.],

[3., 4.]])

print(variable.data.numpy()) # numpy 形式

>>>

[[1. 2.]

[3. 4.]]

完整教学实例

(1) 变量variable是

标量的形式

(例如, 它包含一个元素数据),调用

.backward() 方法

求梯度。

import torch

from torch.autograd import Variable

# 创建 variable(变量)

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

print(x)

>>>

tensor([[1., 1.],

[1., 1.]], requires_grad=True)

# variable(变量)的操作

y = x+2

print(y)

>>>

tensor([[3., 3.],

[3., 3.]], grad_fn=)

print(y.grad_fn) # y 由操作创建,所以它有 grad_fn 属性

>>>

# y 的更多操作

z = y * y * 4

out = z.mean()

print("z:{}\nout:{}\n".format(z, out))

>>>

z:tensor([[36., 36.],

[36., 36.]], grad_fn=)

out:36.0

# 求梯度

out.backward()

print(x.grad) # d(out)/dx 的梯度

>>>

tensor([[10.5000, 10.5000],

[10.5000, 10.5000]])

(2) 变量variable是

非标量的形式

(例如, 它包含更多的元素数据),调用

.backward() 方法

求梯度,必须去指定一个

grad_output 参数

,该参数是一个匹配

shape(形状)

的张量。

import torch

from torch.autograd import Variable

# 创建 variable(变量)

x = Variable(torch.rand(3), requires_grad=True)

print(x)

>>>

tensor([0.4635, 0.4550, 0.5725], requires_grad=True)

# variable(变量)的操作

y = x*2

print(y)

>>>

tensor([0.9271, 0.9100, 1.1449], grad_fn=)

while y.data.norm() < 1000:

y = y*2

print(y)

>>>

tensor([ 949.3414, 931.8120, 1172.4226], grad_fn=)

# 求梯度

gradients = torch.FloatTensor([0.1, 1.0, 0.0001]) # 设置参数gradient

y.backward( gradient=gradients )

print(x.grad)

>>>

tensor([2.0480e+02, 2.0480e+03, 2.0480e-01])

python中list函数中variables变量_如何在Python中使用变量,浅谈,Pytorch,的,Variable,方法...相关推荐

  1. 中boxplot函数的参数设置_如何在Python中生成图形和图表

    在本章中,我们将学习如何在Python中生成图形和图表,同时将使用函数和面向对象的方法来可视化数据. Python中常用的一些可视化数据包括以下几种. Matplotlib. Seaborn. ggp ...

  2. linux中设置环境变量_如何在Linux中设置环境变量

    linux中设置环境变量 Wondering how to set environment variables in Linux? This is exactly what we'll be doin ...

  3. python包含多个元组的元组_如何在python中将多个”列出的”元组连接成一个元组?...

    在python中,关于这个问题的答案很少,如何将一个元组列表连接到一个列表中?,如何在python中合并两个元组?,如何在python中合并任意数量的元组?所有的答案都引用了元组列表,所以提供的解决方 ...

  4. python中哪个函数能生成集合_神奇的python系列11:函数之生成器,列表推导式

    1.生成器 生成器的本质是迭代器. 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 #函数 deffunc():prin ...

  5. python中groupby()函数讲解与示例_详解python中groupby函数通俗易懂

    一.groupby 能做什么? python中groupby函数主要的作用是进行数据的分组以及分组后地组内运算! 对于数据的分组和分组运算主要是指groupby函数的应用,具体函数的规则如下: df[ ...

  6. python中get函数是什么意思_详解python中get函数的用法(附代码)_后端开发

    strncmp函数用法详解_后端开发 strncmp函数为字符串比较函数,其函数语法为"int strncmp ( const char * str1, const char * str2, ...

  7. python画图将标题中有变量_如何在matplotlib中打印变量名作为标题

    在python中不可能轻松地获取变量的名称(请参见answer).对于在python中传递给函数的变量,有使用inspect.详细信息here和基于此answer的案例解决方案的复杂解决方案impor ...

  8. python一次输入多个值_如何在Python的一行中从用户输入多个值?

    为了读取语言C中的多个变量,我们编写类似-//Read three variable in one line scanf("%d %d %d", &x, &y, & ...

  9. activiti 变量_如何在Activiti中使用瞬态变量

    activiti 变量 我们昨天发布的Activiti v6 Beta3中已经加入了很多需要的功能-临时变量. 在这篇文章中,我将向您展示一个示例,说明如何使用瞬态变量来覆盖一些以前不可能(或最佳)的 ...

最新文章

  1. 关于举办第十五届全国大学生智能汽车竞赛浙江赛区选拔赛的通知(草案)
  2. JAVa读取文件的附加属性,Java 读取属性文件
  3. css3边框线倾斜,使用CSS3倾斜边框的Div?
  4. iOS之LLVM编译流程和Clang插件开发集成
  5. stm32怎么调用for循环内部的变量_循环中的异步amp;amp;循环中的闭包
  6. 使用 python 的 urllib2和 urllib模块爆破 form 表单的简易脚本
  7. 实验三:从整理上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换...
  8. 谷歌如何捕获街景中的门牌号码
  9. 松翰单片机 c语言例程 宏定义出错,求助.松翰单片机 2714 用仿真器可以 , 但是烧到单片机不行. (amobbs.com 阿莫电子论坛)...
  10. LoadRunner “add measurements”(添加度量)菜单问题
  11. 导入Model为啥没有addAttribute()方法???
  12. XPDL与WS-BPEL的比较之一:规范发展篇
  13. ERROR 1449 (HY000)
  14. 使用windows自带的测速工具WinSat对移动硬盘进行测速
  15. 创建IRP的相关内容
  16. win10启动修复_win10开机死循环无限重启怎么解决?
  17. 思科模拟器:让同一交换机下不同VLAN间的电脑相互通信
  18. 学生选课系统---数据库课程设计SQL Server
  19. 为什么打不开jar文件?
  20. RBDL动力学库使用示例

热门文章

  1. ubuntu java classpath 设置_在Ubuntu中正确设置java classpath和java_home
  2. JavaScript中的正则
  3. Python 生成requirement 使用requirements.txt
  4. 机器学习中的数学基础相关知识总结
  5. 农用地包括哪些地类_土地地类一览表
  6. selector多路复用_多路复用器Selector
  7. include包含头文件的语句中,双引号和尖括号的区别
  8. 源码安装mysql数据库_Linux下源码安装mysql数据库
  9. Vue-watch选项
  10. RISC-V踩坑记----__builtin_clz((x)库函数的应用