这篇文章主要介绍Pytorch中autograd的坑有哪些,文中介绍的非常免费云主机域名详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!旧版本的Pytorch中,Variable是对Tensor的一个封装;在Pytorch大于v0.4的版本后,Varible和Tensor合并了,意味着Tensor可以像旧版本的Variable那样运行,当然新版本中Variable封装仍旧可以用,但是对Varieble操作返回的将是一个Tensor。对于那些不是任何函数(Function)的输出,由用户创建的节点称为叶子节点,叶子节点的grad_fn为None。首先Tensor是默认不需要求导的,即requires_grad默认为False。如果某一个节点requires_grad被设置为True,那么所有依赖它的节点requires_grad都为True。只有scalar才能进行反向backward()操作,并且backward对于叶节点的grad的是累加的。当只进行计算操作不做backward,叶节点的grad不发生变化。更正一下,并不是只有scaler才能进行backward操作,矩阵和向量也可以,只不过backward()中要添加对应维度的参数。如过tensor的数值需要参与计算又不想参与到计算图的更新中,计算的时候可以用tensor.data,这样既能利用tensor的数值,又不会更新梯度。当tensor.data被修改的时候,tensor也会同步的被修改,此时用该tensor进行计算并backward的时候梯度的值就不再准确了,因为tensor已经被修改了!为了避免因为对tensor.data修改导致grad变化的情况,可以利用tensor.detach,同样可以保证tensor不参与到计算图当中,但是当tensor的值被改变的时候,再进行backward就会报错而不会有先前的因为tensor的值被改变而导致不准的情况了。推荐用tensor.detach的方式而不是tensor.data的方式,因为这样更保险!在计算的时候有时候我们可能会用到非叶节点的grad,但是非叶节点的grad在backward之后就会被自动清空:可以用autograd.grad和hook来处理这种情况:补充:关于Pytorch中autograd和backward的一些笔记Pytorch中所有的计算其实都可以回归到Tensor上,所以有必要重新认识一下Tensor。如果我们需要计算某个Tensor的导数,那么我们需要设置其.requires_grad属性为True。为方便说明,在本文中对于这种我们自己定义的变量,我们称之为叶子节点(leaf nodes),而基于叶子节点得到的中间或最终变量则可称之为结果节点。另外一个Tensor中通常会记录如下图中所示的属性:data
: 即存储的数据信息requires_grad
: 设置为True则表示该 Tensor 需要求导grad: 该 Tensor 的梯度值,每次在计算 backward 时都需要将前一时刻的梯度归零,否则梯度值会一直累加,这个会在后面讲到。grad_fn
: 叶子节点通常为 None,只有结果节点的 grad_fn 才有效,用于指示梯度函数是哪种类型。is_leaf
: 用来指示该 Tensor 是否是叶子节点。举例:运行结果:x requires grad: True, is leaf: True, grad: None, grad_fn: None.y requires grad: True, is leaf: False, grad: None, grad_fn: tensor
: 用于计算梯度的 tensor。也就是说这两种方式是等价的:torch.autograd.backward(z) == z.backward()grad_tensors
: 在计算非标量的梯度时会用到。他其实也是一个tensor,它的shape一般需要和前面的tensor保持一致。retain_graph
: 通常在调用一次 backward 后,pytorch 会自动把计算图销毁,所以要想对某个变量重复调用 backward,则需要将该参数设置为Truecreate_graph
: 当设置为True的时候可以用来计算更高阶的梯度grad_variables
: 这个官方说法是 grad_variables’ is deprecated. Use ‘grad_tensors’ instead. 也就是说这个参数后面版本中应该会丢弃,直接使用grad_tensors就好了。pytorch设计了grad_tensors这么一个参数。它的作用相当于“权重”。先看一个例子:上面的报错信息意思是只有对标量输出它才会计算梯度,而求一个矩阵对另一矩阵的导数束手无策。而grad_tensors这个参数就扮演了帮助求和的作用。换句话说,就是对 Z 和一个权重张量grad_tensors进行 hadamard product 后求和。这也是 grad_tensors 需要与传入的 tensor 大小一致的原因。看了前面的内容后再看这个函数就很好理解了,各参数作用如下:outputs
: 结果节点,即被求导数inputs
: 叶子节点grad_outputs
: 类似于backward方法中的grad_tensorsretain_graph
: 同上create_graph
: 同上only_inputs
: 默认为True,如果为True,则只会返回指定input的梯度值。 若为False,则会计算所有叶子节点的梯度,并且将计算得到的梯度累加到各自的.grad属性上去。allow_unused
: 默认为False, 即必须要指定input,如果没有指定的话则报错。注意该函数返回的是 tuple 类型。以上是“Pytorch中autograd的坑有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注百云主机行业资讯频道!
相关推荐: JavaScript怎么实现警告框、确认框和提示框
这篇文章主要介绍“JavaScript怎么实现警告框、确认框和提示框”,在日常操作中,相信很多人在JavaScript怎么实现警告框、确认框和提示框问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript怎么实现警告框…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。