返回顶部
首页 > 资讯 > 精选 >Pytorch中backward()多个loss函数怎么用
  • 112
分享到

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

2023-06-15 05:06:38 112人浏览 安东尼
摘要

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

这篇文章主要介绍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函数怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Pytorch中backward()多个loss函数怎么用

本文链接: https://lsjlt.com/news/277809.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Pytorch中backward()多个loss函数怎么用
    这篇文章主要介绍Pytorch中backward()多个loss函数怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Pytorch的backward()函数假若有多个loss函数,如何进行反向传播和更新呢?&nb...
    99+
    2023-06-15
  • Pytorch中的backward()多个loss函数怎么用
    这篇文章主要介绍了Pytorch中的backward()多个loss函数怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Pytorch的backward()函数假若有多个...
    99+
    2023-06-15
  • Pytorch中的backward()多个loss函数用法
    Pytorch的backward()函数 假若有多个loss函数,如何进行反向传播和更新呢? x = torch.tensor(2.0, requires_grad=True)...
    99+
    2024-04-02
  • pytorch中backward的参数含义是什么
    本文小编为大家详细介绍“pytorch中backward的参数含义是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“pytorch中backward的参数含义是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-05
  • 怎么用pytorch中backward()方法自动求梯度
    本篇内容介绍了“怎么用pytorch中backward()方法自动求梯度”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!pytorch bac...
    99+
    2023-07-05
  • pytorch中torch.topk()函数怎么用
    这篇文章主要介绍“pytorch中torch.topk()函数怎么用”,在日常操作中,相信很多人在pytorch中torch.topk()函数怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”pytorch...
    99+
    2023-06-29
  • pytorch中的torch.nn.Conv2d()函数怎么用
    这篇文章主要为大家展示了“pytorch中的torch.nn.Conv2d()函数怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“pytorch中的torch.nn.Conv2d()函数怎么...
    99+
    2023-06-29
  • Pytorch中的torch.gather()函数怎么用
    这篇文章将为大家详细讲解有关Pytorch中的torch.gather()函数怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。参数说明以官方说明为例,gather()函数需要三个参数,输入input,...
    99+
    2023-06-25
  • pytorch中Parameter函数怎么使用
    这篇文章主要介绍了pytorch中Parameter函数怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇pytorch中Parameter函数怎么使用文章都会有所收获,下面我们一起来看看吧。用法介绍pyt...
    99+
    2023-06-29
  • Pytorch中怎么调用forward()函数
    这篇文章主要讲解了“Pytorch中怎么调用forward()函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Pytorch中怎么调用forward()函数”吧!Pytorch调用forw...
    99+
    2023-07-05
  • PyTorch中torch.matmul()函数怎么使用
    这篇文章主要介绍了PyTorch中torch.matmul()函数怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PyTorch中torch.matmul()函数怎么使用文章都会有所收获,下面我们一起来看...
    99+
    2023-07-06
  • pytorch中的view()函数怎么使用
    这篇文章主要介绍了pytorch中的view()函数怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇pytorch中的view()函数怎么使用文章都会有所收获,下面我们一起来看看吧。一、普通用法 (手动调...
    99+
    2023-06-29
  • pytorch中BatchNorm2d函数的参数怎么使用
    本篇内容主要讲解“pytorch中BatchNorm2d函数的参数怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“pytorch中BatchNorm2d函数的参数怎么使用”吧!BN原理、作...
    99+
    2023-07-04
  • controller函数中参数列表怎么使用多个@RequestBody
    这篇文章主要介绍“controller函数中参数列表怎么使用多个@RequestBody”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“controller函数中参数列表怎么使用多个@RequestB...
    99+
    2023-07-06
  • PyTorch中怎么定义损失函数
    在PyTorch中,我们可以使用torch.nn模块中的各种损失函数来定义损失函数。以下是一些常用的损失函数及其定义方法: 均方误...
    99+
    2024-04-02
  • pytorch中的squeeze函数、cat函数使用
    1 squeeze(): 去除size为1的维度,包括行和列。 至于维度大于等于2时,squeeze()不起作用。 行、例: >>> torch.rand(4,...
    99+
    2024-04-02
  • c#if函数多个条件怎么用
    C# 处理多个条件的方法包括:使用嵌套 if 语句,将每个条件放在单独的 if 语句中。使用 &&(逻辑与)运算符,检查多个条件是否都为 true。后者更简洁、更易读,示...
    99+
    2024-05-11
    c#
  • c语言怎么调用多个函数
    在 c 语言中,可以通过声明、定义和调用函数名来调用多个函数(1)。函数可以嵌套调用,并且参数可以按值或按引用传递(2、3、4)。按值传递不会修改原始值,而按引用传递允许函数直接修改原始...
    99+
    2024-05-21
    c语言
  • PyTorch中怎么处理多模态数据
    在PyTorch中处理多模态数据通常有两种方法: 使用多输入模型:将不同模态的数据分别输入到模型的不同输入层。可以使用torch....
    99+
    2024-03-05
    PyTorch
  • sql中replace函数怎么替换多个内容
    在SQL中,REPLACE函数只能替换一个内容。如果要替换多个内容,可以使用多个嵌套的REPLACE函数或者使用其他方法实现...
    99+
    2024-04-09
    sql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作