Pytorch的Variable详解

article/2025/10/28 23:34:35

pytorch两个基本对象:Tensor(张量)和Variable(变量)

其中,tensor不能反向传播,variable可以反向传播。

tensor的算术运算和选取操作与numpy一样,一次你numpy相似的运算操作都可以迁移过来。

 

Variable

variable是一种可以不断变化的变量,符合反向传播,参数更新的属性。pytorch的variable是一个存放会变化值的地理位置,里面的值会不停变化,像装糖果(糖果就是数据,即tensor)的盒子,糖果的数量不断变化。pytorch都是由tensor计算的,而tensor里面的参数是variable形式。

扩展

在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(grad_variables=None,retain_graph=None,create_graph=None)

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

PyTorch 的 backward 为什么有一个 grad_variables 参数?

假设 x 经过一番计算得到 y,那么 y.backward(w) 求的不是 y 对 x 的导数,而是 l = torch.sum(y*w) 对 x 的导数。w 可以视为 y 的各分量的权重,也可以视为遥远的损失函数 l 对 y 的偏导数。也就是说,不一定需要从计算图最后的节点 y 往前反向传播,从中间某个节点 n 开始传也可以,只要你能把损失函数 l 关于这个节点的导数 dl/dn 记录下来,n.backward(dl/dn) 照样能往前回传,正确地计算出损失函数 l 对于节点 n 之前的节点的导数。特别地,若 y 为标量,w 取默认值 1.0,才是按照我们通常理解的那样,求 y 对 x 的导数。

5、grad_variable

grad_variables是y求导时的梯度参数,由于autograd仅用于标量,因此当y不是标量且在声明时使用了requires_grad=True,必须指定grad_variables参数,在完成原始的反向传播之后得到的梯度会对这个grad_variables进行修正,然后将结果保存在Variable的grad中。grad_variables形状必须与Variable一致。在深度学习中求导与梯度有关,因此grad_variables一般会定义类似为[1, 0.1, 0.01, 0.001],表示梯度的方向,取较小的之不会对求导效率有影响。

>>>import torch
>>>from torch.autograd import Variable
>>> x=torch.rand(4)
>>> x
tensor([0.4635, 0.4753, 0.1375, 0.3797])>>> x=variable(x,requires_grad=True)
>>> y=x*3
>>> y
tensor([1.3905, 1.4260, 0.4125, 1.1391], grad_fn=<MulBackward0>)>>> grad_variables = torch.FloatTensor([1,2,3,4]) #梯度参数grad_variables形状必须与Variable一致
>>> grad_variables
tensor([1., 2., 3., 4.])>>> y.backward(grad_variables)
>>> x.grad
tensor([ 3.,  6.,  9., 12.])

torch.FloatTensor()


http://chatgpt.dhexx.cn/article/tvCm1WEi.shtml

相关文章

13.2 用Patsy创建模型

1、patsy适合描述statsmodels的线性模型&#xff0c;其公式是一个特殊的字符串语法&#xff0c;表示为模型设计矩阵 2、patsy.dmatrices函数接收一个公式字符串和一个数据集&#xff0c;为线性模型设计矩阵 3、Pasty对象可以直接传递到算法&#xff0c;如下面的最小二乘回归 4、…

Could not find a version

目标检测—教你利用yolov5训练自己的目标检测模型 我自己的另一篇配置文件和代码地址博客总结 CondaHTTPError: HTTP 000 CONNECTION FAILED for url 的问题终极解决方案 配置环境 安装pytorch 利用Anaconda安装pytorch和paddle深度学习环境pycharm安装—免额外安装CUDA和c…

statsmodels遇到的坑!!!

ImportError: cannot import name cached_data ModuleNotFoundError: No module named patsy python SimpleExpSmoothing 错误 statsmodels安装包地址&#xff1a; Python Extension Packages for Windows - Christoph Gohlke (uci.edu) 现已完美解决~

python数据处理包_python数据处理包安装

1> 本机环境 C:\Python27>python Python 2.7.12rc1 (v2.7.12rc1:13912cd1e7e8, Jun 12 2016, 05:57:31) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information.…

手把手教你用Python进行回归(附代码、学习资料)

作者&#xff1a; GURCHETAN SINGH 翻译&#xff1a;张逸 校对&#xff1a;丁楠雅 本文共5800字&#xff0c;建议阅读8分钟。本文从线性回归、多项式回归出发&#xff0c;带你用Python实现样条回归。 我刚开始学习数据科学时&#xff0c;第一个接触到的算法就是线性回归。在把…

【Python数据分析】实践编写篇2:用Python进行回归分析与相关分析

目录 一、前言 1.1 回归分析 1.2 相关分析 二、代码的编写 2.1 前期准备 2.2 编写代码 2.2.1 相关分析 2.2.2 一元线性回归分析 2.2.3 多元线性回归分析 2.2.4 广义线性回归分析 2.2.5 logistic回归分析 三、代码集合 一、前言 1.1 回归分析 是用于研究分析某一变量受其…

chatgpt赋能Python-python_patsy

Python Patsy: 一个用于统计建模的Python库 什么是Patsy&#xff1f; Patsy是一个Python库&#xff0c;用于进行统计建模和数据预处理。Patsy的主要目的是将数据转换为适合统计建模的格式。它是一个基于公式的语言&#xff0c;通过描述预测变量和目标变量之间的关系&#xff…

Simple Linear Regression:ONE

前言 对于一些库的说明 numpy&#xff1a;支持矩阵运算&#xff0c;在矩阵运算这方面可以完全替代基于向量编程的matlab pandas&#xff1a;这个是一个数据存储库&#xff0c;是以表单&#xff08;dataframe&#xff09;为基本单位&#xff0c;这个库的好处在于行列 索引并不是…

python建模库介绍:pandas与建模代码的结合,使用Patsy创建模型描述

13.1 pandas与建模代码的结合 使用pandas用于数据载入和数据清洗&#xff0c;之后切换到模型库去建立模型是一个常见的模型开发工作流。在机器学习中&#xff0c;特征工程时模型开发的重要部分之一&#xff0c;特征工程就是指从原生数据集中提取可用于模型上下文的有效信息的数…

py之patsy:patsy的简介、安装、使用方法之详细攻略

py之patsy&#xff1a;patsy的简介、安装、使用方法之详细攻略 目录 patsy的简介 patsy的安装 patsy的使用方法 patsy的简介 Patsy是一个python库&#xff0c;用于描述统计模型&#xff08;尤其是线性模型&#xff0c;或具有线性组件的模型&#xff09;和构建设计矩阵。Pats…

两个线程循环打印121212...

A线程打印1&#xff0c;B线程打印2&#xff0c;要求循环打印121212... 思路 两个线程&#xff0c;可以想到的是多线程编程&#xff0c;共享变量&#xff0c;数据等&#xff0c;设想先让一个线程打印1&#xff0c;然后处于等待&#xff08;wait&#xff09;状态&#xff0c;接着…

静态路由实验总结

静态路由试验 实验目的 实现此图的全网互通 实验基础知识 路由的工作原理&#xff1a;路由器收到数据包之后&#xff0c;会查看其目标IP地址&#xff0c;会查询本地的路由表&#xff0c;若表中记录有去往目标的路径&#xff0c;则无条件转发&#xff1b;若没有去往目标的路…

C++第八次上机实验总结(多态)

一、实验目的&#xff1a; ①.掌握C语言多态性的基本概念&#xff1b; ②.掌握运算符重载函数的声明和定义方式&#xff1b; 二、试验任务&#xff1a; 1. 编写一个程序&#xff0c;实现两个负数相加&#xff08;分别用类外定义运算符重载函数、友元运算符重载函数、成员运算符…

java程序实验总结_Java实验报告一及作业总结二

Java实验报告 实验一 Java开发环境与简单Java程序 一、 实验目的 (1) 熟悉JDK开发环境 (2) 熟练掌握结构化程序设计方法 二、 实验内容 1. 打印输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其中各位数字立方和等于该数本身。例如,153是一个“水仙花数”。 2. 编写…

计算机网络实验总结

一、ICMP抓包观察及Tracert 抓包分析 1.实验目的 理解ICMP&#xff0c;掌握ICMP帧结构&#xff0c;掌握IP协议原理&#xff0c;理解IP帧结构 2.实验步骤 1、观察ICMP目标不可达消息 使用Ping命令&#xff0c;去ping一个不存在的主机IP&#xff0c;如10.104.125.344。使用wi…

STM32 PWM输出实验总结

本实验是基于STM32 407的板子&#xff0c;使用的是通用定时器TIM14&#xff0c;相关的博文其实有很多&#xff0c;本文主要是基于他们结合个人学习理解总结整理&#xff0c;并非完全原创&#xff0c;只希望能帮助更好理解PWM输出的过程尤其是TIM_ARRPreloadConfig(TIM14, ENABL…

matlab信号与系统实验总结

求特征根 特征方程的求解 A[1 7 16 12] rroots(A)结果 求线代数方程组 format rat A[3 0 0; 4 3 0;2 2 3]; %左边 C[1 2 0]; %右边 Binv(A)*C求单位冲激响应 a2; t0:0.01:5; A[1 a]; B[0 a]; impulse(B,A,t)零状态冲激响应 syms t; y1exp(-2*t)*cos(3*t)*heaviside(t);%原…