浅谈对pytroch中torch.autograd.backward的思考
反向传递法则是深度学习中最为重要的一部分,torch中的backward可以对计算图中的梯度进行计算和累积
这里通过一段程序来演示基本的backward操作以及需要注意的地方
>>>importtorch >>>fromtorch.autogradimportVariable >>>x=Variable(torch.ones(2,2),requires_grad=True) >>>y=x+2 >>>y.grad_fn Out[6]:>>>y.grad >>>z=y*y*3 >>>z.grad_fn Out[9]: >>>z Out[10]: Variablecontaining: 2727 2727 [torch.FloatTensorofsize2x2] >>>out=z.mean() >>>out.grad_fn Out[12]: >>>out.backward()#这里因为out为scalar标量,所以参数不需要填写 >>>x.grad Out[19]: Variablecontaining: 4.50004.5000 4.50004.5000 [torch.FloatTensorofsize2x2] >>>out#out为标量 Out[20]: Variablecontaining: 27 [torch.FloatTensorofsize1] >>>x=Variable(torch.Tensor([2,2,2]),requires_grad=True) >>>y=x*2 >>>y Out[52]: Variablecontaining: 4 4 4 [torch.FloatTensorofsize3] >>>y.backward()#因为y输出为非标量,求向量间元素的梯度需要对所求的元素进行标注,用相同长度的序列进行标注 Traceback(mostrecentcalllast): File"C:\Users\dell\Anaconda3\envs\my-pytorch\lib\site-packages\IPython\core\interactiveshell.py",line2862,inrun_code exec(code_obj,self.user_global_ns,self.user_ns) File" ",line1,in y.backward() File"C:\Users\dell\Anaconda3\envs\my-pytorch\lib\site-packages\torch\autograd\variable.py",line156,inbackward torch.autograd.backward(self,gradient,retain_graph,create_graph,retain_variables) File"C:\Users\dell\Anaconda3\envs\my-pytorch\lib\site-packages\torch\autograd\__init__.py",line86,inbackward grad_variables,create_graph=_make_grads(variables,grad_variables,create_graph) File"C:\Users\dell\Anaconda3\envs\my-pytorch\lib\site-packages\torch\autograd\__init__.py",line34,in_make_grads raiseRuntimeError("gradcanbeimplicitlycreatedonlyforscalaroutputs") RuntimeError:gradcanbeimplicitlycreatedonlyforscalaroutputs >>>y.backward(torch.FloatTensor([0.1,1,10])) >>>x.grad#注意这里的0.1,1.10为梯度求值比例 Out[55]: Variablecontaining: 0.2000 2.0000 20.0000 [torch.FloatTensorofsize3] >>>y.backward(torch.FloatTensor([0.1,1,10])) >>>x.grad#梯度累积 Out[57]: Variablecontaining: 0.4000 4.0000 40.0000 [torch.FloatTensorofsize3] >>>x.grad.data.zero_()#梯度累积进行清零 Out[60]: 0 0 0 [torch.FloatTensorofsize3] >>>x.grad#累积为空 Out[61]: Variablecontaining: 0 0 0 [torch.FloatTensorofsize3] >>>y.backward(torch.FloatTensor([0.1,1,10])) >>>x.grad Out[63]: Variablecontaining: 0.2000 2.0000 20.0000 [torch.FloatTensorofsize3]
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。