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

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])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习·理论篇(2023版)·第002篇深度学习和计算机视觉中的基础数学知识01:线性变换的定义+基于角度的线性变换案例(坐标变换)+点积和投影+矩阵乘法的几何意义+图形化精讲

💕恭喜本博客浏览量达到两百万,CSDN内容合伙人,CSDN人工智能领域实力新星~ 🧡本文章为2021版本迭代更新版本,在结合有效知识的基础上对文章进行合理的增加,使得整个文章时刻顺应时代需要 🧡本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲…

RK3288/RK3399 CPU定频方法

直接上方法 查看cpu能支持的频率 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies 写入userspace说明要用户设定频率 echo userspace > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor 写入上面列出的cpu频率 echo 1608000 > …

notepad++正则表达式去掉关键字所在行

如下图 1、选择正则表达式 2、选择匹配大小写 3、^(.*)KERNEL(.*)$\n 加上\n就是把去除的行删除&#xff0c;不加就算把删除的行替换为空格

深度学习·理论篇(2023版)·第003篇深度学习和计算机视觉中的基础数学知识02:特征向量和特征值+矩阵乘法的几何意义(2)+奇异值分解+线性可分性和维度+非线性变换

&#x1f495;恭喜本博客浏览量达到两百万&#xff0c;CSDN内容合伙人&#xff0c;CSDN人工智能领域实力新星~ &#x1f9e1;本文章为2021版本迭代更新版本&#xff0c;在结合有效知识的基础上对文章进行合理的增加&#xff0c;使得整个文章时刻顺应时代需要 &#x1f9e1;本…

Oracle 控制文件管理

控制文件是一个很小的二进制文件(10MB左右)&#xff0c;含有数据库结构信息&#xff0c;包括数据文件和日志文件信息。控制文件在数据库创建时被自动创建&#xff0c;并在数据库发生物理变数时更新。控制文件被不断更新&#xff0c;在任何时候都要保证控制文件可用&#xff0c;…

数组超过预设的最大数组大小_工作表数组大小的扩展及意义

朋友们好&#xff0c;今日给大家继续讲解VBA数组与字典解决方案的第17讲&#xff0c;数组大小的扩充问题。这一讲的内容相对比较简单&#xff0c;在之前的章节中讲了数组与数组的计算规律&#xff0c;也是利用了数组的扩展原理。其实&#xff0c;两个数组计算时&#xff0c;参与…

Android ANR 实例分析

什么是ANR&#xff1f; 以下四个条件都可以造成ANR发生&#xff1a; InputDispatching Timeout&#xff1a;5秒内无法响应屏幕触摸事件或键盘输入事件BroadcastQueue Timeout &#xff1a;在执行前台广播&#xff08;BroadcastReceiver&#xff09;的onReceive()函数时10秒没…

python图像下采样_[Python图像处理]十二.图像向下取样和向上取样

图像向下取样在图像向下取样中&#xff0c;使用最多的是高斯金字塔。它将对图像Gi进行高斯核卷积&#xff0c;并删除图像中所有的偶数行和列&#xff0c;最终缩小图像&#xff0c;其中高斯卷积核运算就是对整幅图像进行加权平均的过程&#xff0c;每一个像素点的值&#xff0c;…

【GIT 基础篇六】分支管理(创建与合并)

上篇我们整理了如何创建远程仓库&#xff0c;以及如何将本地文件上传至远程仓库&#xff0c;仓库创建好了&#xff0c;我们接下来就要准备开发了&#xff0c;对于使用git而言&#xff0c;通常的习惯就是一人一个分支&#xff0c;等测试无误再合并&#xff1b;又或者根据需求创建…

深度学习·理论篇(2023版)·第005篇深度学习和概率论基础02:一篇文章图形化联合熵/条件熵/交叉熵/KL散度/JS散度/互信息之间的关系+最大似然估计(MLE)

💕恭喜本博客浏览量达到两百万,CSDN内容合伙人,CSDN人工智能领域实力新星~ 🧡本文章为2021版本迭代更新版本,在结合有效知识的基础上对文章进行合理的增加,使得整个文章时刻顺应时代需要 🧡本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲…

git 命令汇总

瞎扯 最近有几个留言想让写下git的内容&#xff0c;git是一个工具&#xff0c;主要是用来管理码农的代码的&#xff0c;理由很简单&#xff0c;码农写的代码太多&#xff0c;自己都不知道可能哪里出现了Crash。Linux也是因为git的出现&#xff0c;可以让世界上越来越多的人维护…

jQuery.Event的一些用法

直接写用法 //创建一个事件 var event $.Event("事件类型",["定义的事件参数最终将出现在e1中"]);//绑定一个处理器 $(obj).on("事件类型",function(e1,e2){console.log(e1);   console.log(e2); })//触发事件 $(obj).trigger(event ,{someD…

我的最佳队友之K8无线蓝牙键盘深度使用测评( Keychron K8 )

K8 无线蓝牙键盘深度使用测评&#xff08; Keychron K8 &#xff09;——500 元左右最适配 Mac 电脑的机械键盘 0.键盘参数&#xff1a; 首先我们在实际测评之前&#xff0c;看下这个键盘的具体参数&#xff0c;心里有个大致的了解~ 87键 国产佳达隆G轴 可选茶轴/红轴/青轴 蓝…

pthread 的坑

为什么写这篇文章? 嵌入式Linux:pthread_create 记录线程使用​zhuanlan.zhihu.com 这是上篇文章使用了pthread_create来实现闪烁led灯,因为代码写的有偏差导致了一个问题,就是不能进入深度休眠 问题产生原因 先了解下互斥锁 线程之间可以共享内存空间,这意味着不同线程…

python多继承_python作用域和多继承

python作用域python无块级作用域 看c语言代码&#xff1a;#includeintmain() {if(2 > 0) {int i 0;}printf("i %d", i);return 0;}在这段代码中&#xff0c;if子句引入了一个局部作用域&#xff0c;变量i就存在于这个局部作用域中&#xff0c;但对外不可见&…

深度学习·理论篇(2023版)·第006篇高维空间下的维度与体积距离的关系:采样和维度+高维空间下体积与距离+中心极限定律与距离分布(深度学习)

💕恭喜本博客浏览量达到两百万,CSDN内容合伙人,CSDN人工智能领域实力新星~ 🧡本文章为2021版本迭代更新版本,在结合有效知识的基础上对文章进行合理的增加,使得整个文章时刻顺应时代需要 🧡本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲…

jquery中json数据转换为字典

首先在前台页面中的json数据为var recipe {};recipe["name"] $("#name").val();recipe["age"] $("#age").val();recipe["sex"] $("#sex").val();recipe["medicine"] "{name: a, value: b}&qu…

你见过哪些操蛋的代码?

NO.1#define TRUE FALSE //Happy debugging suckers快乐的去调试你的代码吧&#xff0c;哈哈NO.2#define NULL (::rand() % 2) // would be quite nice aswell嗯&#xff0c;这个代码也很不错NO.3#define if( if(!卧槽&#xff0c;这个代码更加叼&#xff0c;哈哈&#xff…

后序线索树怎样画图_算法新解刘新宇(二)二叉搜索树:数据结构中的“hello world”...

二叉搜索树BST定义&#xff1a;基于广义二叉树&#xff0c;一颗二叉树定义&#xff1a;或者为空 或者包含三部分&#xff1a;一个值&#xff0c;一个左分支和一个右分支。这两个分支也都是二叉树分支。一颗二叉搜索树是满足下面条件的二叉树&#xff1a;所有左分支的值都小于本…

写代码的三原则

1.不要急于调试&#xff0c;应戒急用忍 不要写一点功能&#xff0c;就Run一下查看效果&#xff0c;这样的做法&#xff0c;源于对自己的不自信。 应该尽量按照思路一直写到&#xff0c;不进行测试&#xff0c;就无法进行下去时候为止。 因为&#xff0c;每次运行程序都要浪费一…