自动求梯度(pytorch版本)——2.20

一、Tensor用于自动求梯度

"tensor"这个单词?般可译作“张量”,张量可以看作是?个多维数组。标量可以看作是0维张量,向量可以看作1维张量,矩阵可以看作是?维张量。

????在深度学习中,我们经常需要对函数求梯度(gradient)。PyTorch提供的autograd 包能够根据输?和前向传播过程?动构建计算图,并执?反向传播。本节将介绍如何使?autograd包来进??动求梯度的有关操作。

概念
????Pytorch中的Tensor 是这个包的核?类,如果将其属性 .requires_grad 设置为 True ,它将开始追踪(track)在其上的所有操作(这样就可以利?链式法则进?梯度传播了)。完成计算后,可以调? .backward() 来完成所有梯度计算。此 Tensor 的梯度将累积到 .grad 属性中。

注意在 y.backward() 时,如果 y 是标量,则不需要为backward()传?任何参数;否则,需要传??个与 y同形的 Tensor

????如果不想要被继续追踪,可以调? .detach() 将其从追踪记录中分离出来,这样就可以防?将来的计算被追踪,这样梯度就传不过去了。此外,还可以? with torch.no_grad() 将不想被追踪的操作代码块包裹起来,这种?法在评估模型的时候很常?,因为在评估模型时,我们并不需要计算可训练参数(requires_grad=True)的梯度。

????Function 是另外?个很?要的类。 TensorFunction 互相结合就可以构建?个记录有整个计算过程的有向?环图(DAG)。每个 Tensor 都有?个 .grad_fn 属性,该属性即创建该 TensorFunction , 就是说该 Tensor 是不是通过某些运算得到的,若是,则 grad_fn 返回?个与这些运算相关的对象,否则是None。

import torch

# 通过设置`requires_grad=Ytue`,使得操作通过链式法则进行梯度传播
x = torch.ones(2, 2, requires_grad=True)
print(x)
print(x.grad_fn)

+的运算操作
y = x+2
print(y)
print(y.grad_fn)
print(x.is_leaf,y.is_leaf)

# 复杂一点的运算操作
z = y*y*2
print(z)
print(z.grad_fn)
out = z.mean()
print(z, out)

????输出结果:

原文地址:https://www.cnblogs.com/somedayLi/p/12339625.html

时间: 2024-08-01 06:42:21

自动求梯度(pytorch版本)——2.20的相关文章

PyTorch入门学习(二):Autogard之自动求梯度

autograd包是PyTorch中神经网络的核心部分,简单学习一下. autograd提供了所有张量操作的自动求微分功能. 它的灵活性体现在可以通过代码的运行来决定反向传播的过程, 这样就使得每一次的迭代都可以是不一样的. Variable类 autograd.Variable是这个包中的核心类. 它封装了Tensor,并且支持了几乎所有Tensor的操作. 一旦你完成张量计算之后就可以调用.backward()函数,它会帮你把所有的梯度计算好. 通过Variable的.data属性可以获取到

『PyTorch』第三弹_自动求导

torch.autograd 包提供Tensor所有操作的自动求导方法. 数据结构介绍 autograd.Variable 这是这个包中最核心的类. 它包装了一个Tensor,并且几乎支持所有的定义在其上的操作.一旦完成了你的运算,你可以调用 .backward()来自动计算出所有的梯度,Variable有三个属性: 访问原始的tensor使用属性.data: 关于这一Variable的梯度则集中于 .grad: .creator反映了创建者,标识了是否由用户使用.Variable直接创建(No

PyTorch 1.0 中文文档:自动求导机制

译者:冯宝宝 本说明将概述autograd(自动求导)如何工作并记录每一步操作.了解这些并不是绝对必要的,但我们建议您熟悉它,因为它将帮助你编写更高效,更清晰的程序,并可以帮助您进行调试. 反向排除子图 每个张量都有一个标志:requires_grad,允许从梯度计算中细致地排除子图,并可以提高效率. requires_grad 只要有单个输入进行梯度计算操作,则其输出也需要梯度计算.相反,只有当所有输入都不需要计算梯度时,输出才不需要梯度计算.如果其中所有的张量都不需要进行梯度计算,后向计算不

理解GBDT算法(三)——基于梯度的版本

上一篇中我们讲到了GBDT算法的第一个版本,是基于残差的学习思路.今天来说第二个版本,可以说这个版本的比较复杂,涉及到一些推导和矩阵论知识.但是,我们今天可以看到,两个版本之间的联系,这个是学习算法的一个重要步骤. 这篇博文主要从下面这几个方面来说基于梯度的GBDT算法: (1)算法的基本步骤: (2)其中的学数学推导: (3)基于梯度的版本和基于残差的版本之间的联系: 在讲解算法的详细步骤之前,我们可以先明确一个思路,就是梯度版本的GBDT是用多类分类Multi-class classific

Elasticsearch最新版本2.20特性及如何安装

版本选择:Elasticsearch最新版本2.20 Elasticsearch的更新速度实在太快了,16年2月2日更新到了2.2版本,首先看一下这个版本增加了哪些新的特性.首先是基于Lucene 5.4.1,修复了Elasticsearch 2.1.2和Elasticsearch 1.7.5版本中存在的很多bug,同时Elasticsearch 2.2.0增加了两个很棒的新功能:查询分析器和增强地理位置字段.这个版本增加了更加严格的安全性和修复了2.1的一个重大bug,就是在分片恢复的时候会非

2/1+3/2+5/3+8/5+13/8+…求出这个数列前20项的和

★有一个分数序列2/1+3/2+5/3+8/5+13/8+-求出这个数列前20项的和. #include<stdio.h> #include<stdlib.h> int main() { int i = 0; double x = 2.0, y = 1.0, z = 0.0; double sum = 0; for (i = 1; i <= 20; i++) { sum = sum+x / y; z = x; x = x + y; y = z; } printf("

添加一列,自动求序号

1.点击加号 2.点击要求行数的地点,在打开的窗口中输入代码 getrow() 3.点击OK,就可以实现显示该行的行数 添加一列,自动求序号,布布扣,bubuko.com

用python实现二次函数的求导、求梯度、求模

建立一个Function类,构造函数的参数是一个函数 其中part的功能是求偏导,var_index表示是第几个变量,val表示这些变量的值 diff的功能是方便一元函数求导 为方便梯度进行线性代数运算,在定义grad函数时,返回值转化成了numpy.array类型 #求导所得为近似结果 from numpy import * #定义Function类 class Function: def __init__(self, _f): self.fun = _f def value(self, va

7-2 求最大值及其下标 (20 分)

7-2 求最大值及其下标 (20 分) 本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始). 输入格式: 输入在第一行中给出一个正整数n(1<n≤10).第二行输入n个整数,用空格分开. 输出格式: 在一行中输出最大值及最大值的最小下标,中间用一个空格分开. 输入样例: 6 2 8 10 1 9 10 输出样例: 10 2 实验流程 实验代码 #include<stdio.h> int main() { int n,t,i; scanf("%d&qu