我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Pytorch中backward()多个loss函数怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Pytorch中backward()多个loss函数怎么用

这篇文章主要介绍Pytorch中backward()多个loss函数怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

Pytorch的backward()函数

假若有多个loss函数,如何进行反向传播和更新呢?

 x = torch.tensor(2.0, requires_grad=True)                                                     y = x**2                                                                                      z = x                                                                                        # 反向传播 y.backward()                                                                                  x.grad                                                                                        tensor(4.) z.backward()                                                                                  x.grad                                                                                        tensor(5.) ## 累加

补充:Pytorch中torch.autograd ---backward函数的使用方法详细解析,具体例子分析

backward函数

官方定义:

torch.autograd.backward(tensors, grad_tensors=None, retain_graph=None, create_graph=False, grad_variables=None)

Computes the sum of gradients of given tensors w.r.t. graph leaves.The graph is differentiated using the chain rule. If any of tensors are non-scalar (i.e. their data has more than one element) and require gradient, the function additionally requires specifying grad_tensors. It should be a sequence of matching length, that contains gradient of the differentiated function w.r.t. corresponding tensors (None is an acceptable value for all tensors that don't need gradient tensors). This function accumulates gradients in the leaves - you might need to zero them before calling it.

翻译和解释:

参数tensors如果是标量,函数backward计算参数tensors对于给定图叶子节点的梯度( graph leaves,即为设置requires_grad=True的变量)。

参数tensors如果不是标量,需要另外指定参数grad_tensors,参数grad_tensors必须和参数tensors的长度相同。在这一种情况下,backward实际上实现的是代价函数(loss = torch.sum(tensors*grad_tensors); 注:torch中向量*向量实际上是点积,因此tensors和grad_tensors的维度必须一致 )关于叶子节点的梯度计算,而不是参数tensors对于给定图叶子节点的梯度。如果指定参数grad_tensors=torch.ones((size(tensors))),显而易见,代价函数关于叶子节点的梯度,也就等于参数tensors对于给定图叶子节点的梯度。

每次backward之前,需要注意叶子梯度节点是否清零,如果没有清零,第二次backward会累计上一次的梯度。

下面给出具体的例子:

import torchx=torch.randn((3),dtype=torch.float32,requires_grad=True)y = torch.randn((3),dtype=torch.float32,requires_grad=True)z = torch.randn((3),dtype=torch.float32,requires_grad=True)t = x + yloss = t.dot(z)  #求向量的内积

在调用 backward 之前,可以先手动求一下导数,应该是:

Pytorch中backward()多个loss函数怎么用

用代码实现求导:

loss.backward(retain_graph=True)print(z,x.grad,y.grad)  #预期打印出的结果都一样print(t,z.grad)    #预期打印出的结果都一样print(t.grad)    #在这个例子中,x,y,z就是叶子节点,而t不是,t的导数在backward的过程中求出来回传之后就会被释放,因而预期结果是None

结果和预期一致:

tensor([-2.6752, 0.2306, -0.8356], requires_grad=True) tensor([-2.6752, 0.2306, -0.8356]) tensor([-2.6752, 0.2306, -0.8356])

tensor([-1.1916, -0.0156, 0.8952], grad_fn=<AddBackward0>) tensor([-1.1916, -0.0156, 0.8952]) None

敲重点:

注意到前面函数的解释中,在参数tensors不是标量的情况下,tensor.backward(grad_tensors)实现的是代价函数(torch.sum(tensors*grad_tensors))关于叶子节点的导数。

在上面例子中,loss = t.dot(z),因此用t.backward(z),实现的就是loss对于所有叶子结点的求导,实际运算结果和预期吻合。

t.backward(z,retain_graph=True)print(z,x.grad,y.grad)print(t,z.grad)

运行结果如下:

tensor([-0.7830, 1.4468, 1.2440], requires_grad=True) tensor([-0.7830, 1.4468, 1.2440]) tensor([-0.7830, 1.4468, 1.2440])

tensor([-0.7145, -0.7598, 2.0756], grad_fn=<AddBackward0>) None

上面的结果中,出现了一个问题,虽然loss关于x和y的导数正确,但是z不再是叶子节点了。

问题1:

当使用t.backward(z,retain_graph=True)的时候, print(z.grad)结果是None,这意味着z不再是叶子节点,这是为什么呢?

另外一个尝试,loss = t.dot(z)=z.dot(t),但是如果用z.backward(t)替换t.backward(z,retain_graph=True),结果却不同。

z.backward(t)print(z,x.grad,y.grad)print(t,z.grad)

运行结果:

tensor([-1.0716, -1.3643, -0.0016], requires_grad=True) None None

tensor([-0.7324, 0.9763, -0.4036], grad_fn=<AddBackward0>) tensor([-0.7324, 0.9763, -0.4036])

问题2:

上面的结果中可以看到,使用z.backward(t),x和y都不再是叶子节点了,z仍然是叶子节点,且得到的loss相对于z的导数正确。

上述仿真出现的两个问题,我还不能解释,希望和大家交流。

问题1:

当使用t.backward(z,retain_graph=True)的时候, print(z.grad)结果是None,这意味着z不再是叶子节点,这是为什么呢?

问题2:

上面的结果中可以看到,使用z.backward(t),x和y都不再是叶子节点了,z仍然是叶子节点,且得到的loss相对于z的导数正确。

另外强调一下,每次backward之前,需要注意叶子梯度节点是否清零,如果没有清零,第二次backward会累计上一次的梯度。

简单的代码可以看出:

#测试1,:对比上两次单独执行backward,此处连续执行两次backwardt.backward(z,retain_graph=True)print(z,x.grad,y.grad)print(t,z.grad)z.backward(t)print(z,x.grad,y.grad)print(t,z.grad)# 结果x.grad,y.grad本应该是None,因为保留了第一次backward的结果而打印出上一次梯度的结果tensor([-0.5590, -1.4094, -1.5367], requires_grad=True) tensor([-0.5590, -1.4094, -1.5367]) tensor([-0.5590, -1.4094, -1.5367])tensor([-1.7914,  0.8761, -0.3462], grad_fn=<AddBackward0>) Nonetensor([-0.5590, -1.4094, -1.5367], requires_grad=True) tensor([-0.5590, -1.4094, -1.5367]) tensor([-0.5590, -1.4094, -1.5367])tensor([-1.7914,  0.8761, -0.3462], grad_fn=<AddBackward0>) tensor([-1.7914,  0.8761, -0.3462])
#测试2,:连续执行两次backward,并且清零,可以验证第二次backward没有计算x和y的梯度t.backward(z,retain_graph=True)print(z,x.grad,y.grad)print(t,z.grad)x.grad.data.zero_()y.grad.data.zero_()z.backward(t)print(z,x.grad,y.grad)print(t,z.grad)tensor([ 0.8671, 0.6503, -1.6643], requires_grad=True) tensor([ 0.8671, 0.6503, -1.6643]) tensor([ 0.8671, 0.6503, -1.6643])tensor([1.6231e+00, 1.3842e+00, 4.6492e-06], grad_fn=<AddBackward0>) Nonetensor([ 0.8671,  0.6503, -1.6643], requires_grad=True) tensor([0., 0., 0.]) tensor([0., 0., 0.])tensor([1.6231e+00, 1.3842e+00, 4.6492e-06], grad_fn=<AddBackward0>) tensor([1.6231e+00, 1.3842e+00, 4.6492e-06])

pytorch的优点

1.PyTorch是相当简洁且高效快速的框架;2.设计追求最少的封装;3.设计符合人类思维,它让用户尽可能地专注于实现自己的想法;4.与google的Tensorflow类似,FAIR的支持足以确保PyTorch获得持续的开发更新;5.PyTorch作者亲自维护的论坛 供用户交流和求教问题6.入门简单

以上是“Pytorch中backward()多个loss函数怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Pytorch中backward()多个loss函数怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Pytorch中backward()多个loss函数怎么用

这篇文章主要介绍Pytorch中backward()多个loss函数怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Pytorch的backward()函数假若有多个loss函数,如何进行反向传播和更新呢? x
2023-06-15

Pytorch中的backward()多个loss函数怎么用

这篇文章主要介绍了Pytorch中的backward()多个loss函数怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Pytorch的backward()函数假若有多个
2023-06-15

怎么用pytorch中backward()方法自动求梯度

本篇内容介绍了“怎么用pytorch中backward()方法自动求梯度”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!pytorch bac
2023-07-05

pytorch中torch.topk()函数怎么用

这篇文章主要介绍“pytorch中torch.topk()函数怎么用”,在日常操作中,相信很多人在pytorch中torch.topk()函数怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”pytorch
2023-06-29

PyTorch中torch.matmul()函数怎么使用

这篇文章主要介绍了PyTorch中torch.matmul()函数怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PyTorch中torch.matmul()函数怎么使用文章都会有所收获,下面我们一起来看
2023-07-06

Pytorch中怎么调用forward()函数

这篇文章主要讲解了“Pytorch中怎么调用forward()函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Pytorch中怎么调用forward()函数”吧!Pytorch调用forw
2023-07-05

Pytorch中的torch.gather()函数怎么用

这篇文章将为大家详细讲解有关Pytorch中的torch.gather()函数怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。参数说明以官方说明为例,gather()函数需要三个参数,输入input,
2023-06-25

pytorch中Parameter函数怎么使用

这篇文章主要介绍了pytorch中Parameter函数怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇pytorch中Parameter函数怎么使用文章都会有所收获,下面我们一起来看看吧。用法介绍pyt
2023-06-29

pytorch中的torch.nn.Conv2d()函数怎么用

这篇文章主要为大家展示了“pytorch中的torch.nn.Conv2d()函数怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“pytorch中的torch.nn.Conv2d()函数怎么
2023-06-29

pytorch中的view()函数怎么使用

这篇文章主要介绍了pytorch中的view()函数怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇pytorch中的view()函数怎么使用文章都会有所收获,下面我们一起来看看吧。一、普通用法 (手动调
2023-06-29

pytorch中BatchNorm2d函数的参数怎么使用

本篇内容主要讲解“pytorch中BatchNorm2d函数的参数怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“pytorch中BatchNorm2d函数的参数怎么使用”吧!BN原理、作
2023-07-04

controller函数中参数列表怎么使用多个@RequestBody

这篇文章主要介绍“controller函数中参数列表怎么使用多个@RequestBody”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“controller函数中参数列表怎么使用多个@RequestB
2023-07-06

c语言怎么调用多个函数

在 c 语言中,可以通过声明、定义和调用函数名来调用多个函数(1)。函数可以嵌套调用,并且参数可以按值或按引用传递(2、3、4)。按值传递不会修改原始值,而按引用传递允许函数直接修改原始值(3、4)。这些机制促进了代码重用和程序模块化。如何
c语言怎么调用多个函数
2024-05-21

c#if函数多个条件怎么用

C# 处理多个条件的方法包括:使用嵌套 if 语句,将每个条件放在单独的 if 语句中。使用 &&(逻辑与)运算符,检查多个条件是否都为 true。后者更简洁、更易读,示例如下:int age = 25;bool isStudent =
c#if函数多个条件怎么用
2024-05-11

PyTorch中怎么处理多模态数据

在PyTorch中处理多模态数据通常有两种方法:使用多输入模型:将不同模态的数据分别输入到模型的不同输入层。可以使用torch.nn.Sequential将不同模态的数据处理成不同的特征表示,然后将这些特征表示拼接或者合并起来,作为模型的输
PyTorch中怎么处理多模态数据
2024-03-05

sql中replace函数怎么替换多个内容

在SQL中,REPLACE函数只能替换一个内容。如果要替换多个内容,可以使用多个嵌套的REPLACE函数或者使用其他方法实现。以下是使用多个嵌套的REPLACE函数实现替换多个内容的示例:SELECT REPLACE(REPLACE(c
sql中replace函数怎么替换多个内容
2024-04-09

怎么在python中使用zip()函数遍历多个列表

这篇文章将为大家详细讲解有关怎么在python中使用zip()函数遍历多个列表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python的优点有哪些1、简单易用,与C/C++、Java、C#
2023-06-14

java函数怎么返回多个值

在Java中,函数只能返回一个值。但是我们可以通过多种方式来实现返回多个值的效果:使用数组或者集合:我们可以将多个值存储在数组或集合中,然后将该数组或集合作为函数的返回值进行返回。这样就可以实现返回多个值的效果。public static
java函数怎么返回多个值
2024-03-11

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录