pytorch中backward()方法如何自动求梯度

 更新时间:2023年02月20日 14:25:55   作者:不一样的天蝎座  
这篇文章主要介绍了pytorch中backward()方法如何自动求梯度问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

pytorch backward()方法自动求梯度

1、区分源张量和结果张量

x = torch.arange(-8.0, 8.0, 0.1, requires_grad= True)
y = x.relu()

x为源张量,基于源张量x得到的张量y为结果张量。

2、如何使用backward()方法自动求梯度

一个标量调用它的backward()方法后,会根据链式法则自动计算出源张量的梯度值。

2.1、结果张量是一维张量

基于以上例子,就是将一维张量y变成标量后,然后通过调用backward()方法,就能自动计算出x的梯度值。

那么,如何将一维张量y变成标量呢?

一般通过对一维张量y进行求和来实现,即y.sum()。

一个一维张量就是一个向量,对一维张量求和等同于这个向量点乘一个等维的单位向量,使用求和得到的标量y.sum()对源张量x求导与y的每个元素对x的每个元素求导结果是一样的,最终对源张量x的梯度求解没有影响。

因此,代码如下:

y.sum().backward() 
x.grad

2.2、结果张量是二维张量或更高维张量

撇开上面例子,结果变量y可能是二维张量或者更高维的张量,这时可以理解为一般点乘一个等维的单位张量(点乘,是向量中的概念,这样描述只是方便理解)

代码如下:

y.backward(torch.ones_like(y))#grad_tensors=torch.ones_like(y)
x.grad

pytorch中的梯度计算

什么是梯度?

在一元函数中,某点的梯度标的就说某点的导数. 在多元函数中某点的梯度表示的是由每个自变量所对应的偏导数所组成的向量

在前面的线性回归中 就像y = wx + b方程中求出w参数最优的解,就需要对w参数进行偏导数的求取,然后通过偏导数的值来调整w参数以便找到最优解。

自动计算梯度和偏导数

在PyTorch中可以使用torch.autograd.backward()方法来自动计算梯度

在定义张量时,可以指定requires_grad=True表示这个张量可以求偏导数

import torch
# 随机出张量x 指定可以计算偏导数
x = torch.randn(1,requires_grad=True)
# y和z张量不可以求偏导
y = torch.randn(1)
z = torch.randn(1)
# f1中有张量允许求偏导
f1 = 2*x + y
# f2中没有张量可以允许求偏导
f2 = y + z
# 打印两个方程的梯度
print(f1.grad_fn)
print(f2.grad_fn)

得出结论:

  • f1中有允许可以求偏导的张量存在才可以求梯度
  • grad_fn为梯度

1. 求x的偏导数

# 可以求梯度的变量先使用backward()反向传播
f1.backward()
# 使用张量的grad属性拿到偏导数的值
x.grad

2. 停止梯度的计算

张量.requires_grad_(False)

# 创建张量 指定可以求偏导
a = torch.randn(2,2,requires_grad=True)
# a对应的b变量
b = ((a * 3)/(a - 1))
# 查看梯度
print(b.grad_fn)
# 停止a张量可以求偏导
a.requires_grad_(False)
# 再次指定b对应变量
b = ((a * 3) / (a - 1))
# 为None了
print(b.grad_fn)

3. 获取到可以求偏导数的张量相同的内容,但是新变量不可以求偏导

张量.detach()方法

a = torch.randn(2,2,requires_grad=True)
# 可以求偏导的张量返回一个相同的张量但是不可以求偏导数
b = a.detach()
print(a.requires_grad)
print(b.requires_grad)

4. 在作用域中张量不可计算偏导数

with torch.no_grad(): 内的整个作用域

a = torch.randn(2, 2, requires_grad=True)
print((a ** 2).requires_grad)
with torch.no_grad():
    print((a ** 2).requires_grad)

梯度的清空

在PyTorch中,如果我们利用torch.autograd.backward()方法求解张量的梯度, 在多次运行该函数的情况下, 该函数会将计算得到的梯度累加起来。

所以在函数中计算张量的偏导数,每次计算完修改完参数要清空梯度的计算。

不清空梯度计算:

x = torch.ones(4, requires_grad=True)
y = (2*x + 1).sum()
z = (2*x).sum()
y.backward()
print("第一次偏导:",x.grad)
z.backward()
print("第二次偏导:",x.grad)

会累加

使用张量.grad.zero_()方法清空梯度的计算:

x = torch.ones(4, requires_grad=True)
y = (2*x + 1).sum()
z = (2*x).sum()
y.backward()
x.grad.zero_()
print("第一次偏导:",x.grad)
z.backward()
print("第二次偏导:",x.grad)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python中作用域的深入讲解

    Python中作用域的深入讲解

    这篇文章主要给大家介绍了关于Python中作用域的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • python中jieba模块的深入了解

    python中jieba模块的深入了解

    这篇文章主要介绍了python中jieba模块的深入了解,jieba模块是一个python第三方中文分词模块,可以用于将语句中的中文词语分离出来
    2022-06-06
  • Python Django ORM连表正反操作技巧

    Python Django ORM连表正反操作技巧

    这篇文章主要介绍了Django-ORM-连表正反操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-06-06
  • Django自带用户认证系统使用方法解析

    Django自带用户认证系统使用方法解析

    这篇文章主要介绍了Django自带用户认证系统使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Python学习笔记之自定义函数用法详解

    Python学习笔记之自定义函数用法详解

    这篇文章主要介绍了Python学习笔记之自定义函数用法,结合实例形式详细分析了自定义函数的功能、定义、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-06-06
  • 利用numpy和pandas处理csv文件中的时间方法

    利用numpy和pandas处理csv文件中的时间方法

    下面小编就为大家分享一篇利用numpy和pandas处理csv文件中的时间方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python连接Redis库常见操作全面详解

    Python连接Redis库常见操作全面详解

    本文将介绍如何在Python中进行Redis操作,包括连接Redis、数据存储、数据检索和其他常见操作,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • python playwright 库上传和下载操作(自动化测试 playwright)

    python playwright 库上传和下载操作(自动化测试 playwright)

    这篇文章主要介绍了python playwright 库上传和下载操作(自动化测试 playwright ),playwright中的上传和下载比selenium的上传和下载要简便些,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • python报错unexpected indent的解决办法

    python报错unexpected indent的解决办法

    这篇文章主要给大家介绍了关于python报错unexpected indent的解决办法,在python中出现"Unexpected indent"可能是代码的缩进出现问题,需要的朋友可以参考下
    2023-06-06
  • Python之NumPy(axis=0 与axis=1)区分详解

    Python之NumPy(axis=0 与axis=1)区分详解

    这篇文章主要介绍了Python之NumPy(axis=0 与axis=1)区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05

最新评论