解决torch.autograd.backward中的参数问题
作者:coordinate_blog 发布时间:2023-11-19 13:16:50
torch.autograd.backward(variables, grad_variables=None, retain_graph=None, create_graph=False)
给定图的叶子节点variables, 计算图中变量的梯度和。 计算图可以通过链式法则求导。如果variables中的任何一个variable是 非标量(non-scalar)的,且requires_grad=True。那么此函数需要指定grad_variables,它的长度应该和variables的长度匹配,里面保存了相关variable的梯度(对于不需要gradient tensor的variable,None是可取的)。
此函数累积leaf variables计算的梯度。你可能需要在调用此函数之前将leaf variable的梯度置零。
参数:
variables(变量的序列) - 被求微分的叶子节点,即 ys 。
grad_variables((张量,变量)的序列或无) - 对应variable的梯度。仅当variable不是标量且需要求梯度的时候使用。
retain_graph(bool,可选) - 如果为False,则用于释放计算grad的图。请注意,在几乎所有情况下,没有必要将此选项设置为True,通常可以以更有效的方式解决。默认值为create_graph的值。
create_graph(bool,可选) - 如果为True,则将构造派生图,允许计算更高阶的派生产品。默认为False。
我这里举一个官方的例子
import torch
from torch.autograd import Variable
x = Variable(torch.ones(2, 2), requires_grad=True)
y = x + 2
z = y * y * 3
out = z.mean()
out.backward()#这里是默认情况,相当于out.backward(torch.Tensor([1.0]))
print(x.grad)
输出结果是
Variable containing:
4.5000 4.5000
4.5000 4.5000
[torch.FloatTensor of size 2x2]
接着我们继续
x = torch.randn(3)
x = Variable(x, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)
print(x.grad)
输出结果是
Variable containing:
204.8000
2048.0000
0.2048
[torch.FloatTensor of size 3]
这里这个gradients为什么要是[0.1, 1.0, 0.0001]?
如果输出的多个loss权重不同的话,例如有三个loss,一个是x loss,一个是y loss,一个是class loss。那么很明显的不可能所有loss对结果影响程度都一样,他们之间应该有一个比例。那么比例这里指的就是[0.1, 1.0, 0.0001],这个问题中的loss对应的就是上面说的y,那么这里的输出就很好理解了dy/dx=0.1*dy1/dx+1.0*dy2/dx+0.0001*dy3/dx。
如有问题,希望大家指正,谢谢_!
来源:https://blog.csdn.net/qq_17550379/article/details/78939046


猜你喜欢
- Reference:https://www.tensorflow.org/install/migrationtensorflow 更新到1.
- 这个问题是py2和py3兼容性的问题在py2中,判断key是否属于dict的写法可以是:d={'name':'abc
- 前言最近在学习python,学习到了一个之前没接触过的--特殊方法。什么是特殊方法?当我们在设计一个类的时候,python中有一个用于初始化
- 今天发现百度图片搜索结果的2级页面改版了,在浏览图片的时候很好用:如图:在浏览图片的时候,右侧的缩略图是这样交互的:因此,在整个浏览图片的过
- 前言在pytorch中, 想删除tensor中的指定行列,原本以为有个函数或者直接把某一行赋值为[]就可以,结果发现没这么简单,因此用了一个
- MySQL使用于认证目的的用户名,与Unix用户名(登录名字)或Windows用户名无关。缺省地,大多数MySQL客户尝试使用当前Unix用
- 0 前言安装:pip install pypiwin32 1 Excel的APIimport win32com.client as win3
- 看着自己少得可怜的访问量,突然有一个想用爬虫刷访问量的想法,主要也是抱着尝试的心态,学习学习。其实市面上有一些软件可以代刷流量 比如 流量精
- 视频本教程的视频碰撞碰撞是游戏开发的基本组成部分。碰撞检测就是要检测游戏中的一个对象是否正在接触另一个对象。碰撞处理决定了当碰撞发生时你想要
- jieba库是一款优秀的 Python 第三方中文分词库,jieba 支持三种分词模式:精确模式、全模式和搜索引擎模式,下面是三种模式的特点
- 1,查看py文件内的所有成员及快速定位到代码块如果你的py文件代码超过200行,一定要采用这个方法,能大大提高你的代码查找效率。方法1:(1
- 本文实例讲述了javascript面向对象三大特征之封装。分享给大家供大家参考,具体如下:封装封装(Encapsulation):就是把对象
- load与loads简介:在python自动化中,我们传递一些参数是需要从文件中读取过来的,读取过来的字典并非python对象数据类型而是s
- 代码如下dat=['1', '2', '3', '0', '0
- 0.触发器的基本概念触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据
- 一、常见反爬机制及其破解方式封禁IP,使用cookie等前面文章已经讲过现在主要将下面的:~ 验证码 —> 文字验证码 —> O
- 将Copy of ********.bmp或者Copy of Copy of ********.bmp 此类文件统一命名为********0
- 本文实例讲述了Python Web框架之Django框架Model基础。分享给大家供大家参考,具体如下:model是关于你的数据的单一的,确
- 1提取 PDF 内容# pip install PyPDF2 安装 PyPDF2import PyPDF2from PyPDF2
- MySQL的SQRT函数是用来计算出任何数量的平方根。可以使用SELECT语句找出方检定根的任意数如下:mysql> select S