开源网站模板cms,红色网站 后台,做网站时默认字体是微软雅黑,网店运营具体做什么深度之眼官方账号 - 01-04-mp4-计算图与动态图机制
前置知识#xff1a;计算图 可以参考我的笔记#xff1a; 【学习笔记】计算机视觉与深度学习(2.全连接神经网络)
计算图 以这棵计算图为例。这个计算图中#xff0c;叶子节点为x和w。
import torchw torch.tensor([1.]…深度之眼官方账号 - 01-04-mp4-计算图与动态图机制
前置知识计算图 可以参考我的笔记 【学习笔记】计算机视觉与深度学习(2.全连接神经网络)
计算图 以这棵计算图为例。这个计算图中叶子节点为x和w。
import torchw torch.tensor([1.], requires_gradTrue)
x torch.tensor([2.], requires_gradTrue)a torch.add(w, x)
b torch.add(w, 1)
y torch.mul(a, b)# 调用backward()方法开始反向求梯度
y.backward()
print(w.grad)print(is_leaf:\n, w.is_leaf, x.is_leaf, a.is_leaf, b.is_leaf, y.is_leaf)
print(gradient:\n, w.grad, x.grad, a.grad, b.grad, y.grad)输出
tensor([5.])
is_leaf:True True False False False
gradient:tensor([5.]) tensor([2.]) None None None由此可见非叶子节点在最后不会被保留梯度。这是出于节省空间的需要而这样设计的。实际的计算图会非常大如果每个节点都保留梯度会占用非常大的存储空间而这些节点的梯度对于我们学习并没有什么帮助。
如果非要看他们的梯度可以这样操作在a torch.add(w, x)的后面加上一句a.retain_grad()这样a的梯度就会被存储起来。 输出会变成
tensor([5.])
is_leaf:True True False False False
gradient:tensor([5.]) tensor([2.]) tensor([2.]) None None对于节点还可以看这些节点进行的运算。grad_fngradient function的缩写表示这个节点的tensor是什么运算产生的。加一句
print(gradient function:\n, w.grad_fn, \n, x.grad_fn, \n, a.grad_fn, \n, b.grad_fn, \n, y.grad_fn)会输出
gradient function:NoneNoneAddBackward0 object at 0x000001B1DA3651C0AddBackward0 object at 0x000001B1DA3651F0MulBackward0 object at 0x000001B1DA3515B0retain_graph
import torchw torch.tensor([1.], requires_gradTrue)
x torch.tensor([2.], requires_gradTrue)a torch.add(w, x)
a.retain_grad()
b torch.add(w, 1)
y torch.mul(a, b)# 调用backward()方法开始反向求梯度
y.backward()
y.backward()连续两次调用backward()方法会报这样的错误 RuntimeError: Trying to backward through the graph a second time (or directly access saved tensors after they have already been freed). Saved intermediate values of the graph are freed when you call .backward() or autograd.grad(). Specify retain_graphTrue if you need to backward through the graph a second time or if you need to access saved tensors after calling backward. 原因是我们进行第一次backward()后计算图就被自动释放掉了进行第二次backward()时没有计算图可以计算梯度于是报错。
解决方案backward内部添加一个参数retain_graphTrue意思是计算完梯度后保留计算图。
# 调用backward()方法开始反向求梯度
y.backward(retain_graphTrue)
y.backward()这样就不会报错了。
gradient
当计算图末部的节点有1个以上时有时我们会希望他们之间的梯度有一个权重关系。这时就会用上gradient。
import torchw torch.tensor([1.], requires_gradTrue)
x torch.tensor([2.], requires_gradTrue)a torch.add(w, x)
b torch.add(w, 1)# 不难看出y0和y1是两个互不干扰的末部节点
y0 torch.mul(a, b)
y1 torch.add(a, b)# 将两个末部节点打包起来
loss torch.cat([y0, y1], dim0)
grad_tensors torch.tensor([1., 2.])# 将grad_tensors中的内容作为权重变成y02y1
loss.backward(gradientgrad_tensors)print(w.grad)输出
tensor([9.])如果把grad_tensors改成
grad_tensors torch.tensor([1., 3.])输出变成
tensor([11.])torch.autograd.grad()
除了加减乘除法我们还可以对torch进行求导操作。求的是 d ( o u t p u t s ) d ( i n p u t s ) \frac{d(outputs)}{d(inputs)} d(inputs)d(outputs)。
torch.autograd.grad(outputs,inputs,grad_outputsNone,retain_graphNone,create_graphFalse)outputs和inputs已在上述定义中给出 grad_outputs多梯度权重 retain_graph保留计算图 create_graph创建计算图。
import torch# y x ** 2
x torch.tensor([3.], requires_gradTrue)
y torch.pow(x, 2)# grad_1 dy / dx 2x 6
grad_1 torch.autograd.grad(y, x, create_graphTrue)
print(grad_1)# grad_2 d(dy / dx) / dx 2
grad_2 torch.autograd.grad(grad_1, x)
print(grad_2)输出
(tensor([6.], grad_fnMulBackward0),)
(tensor([2.]),)autograd注意事项
1.梯度不会自动清零
import torchw torch.tensor([1.], requires_gradTrue)
x torch.tensor([2.], requires_gradTrue)for i in range(4):a torch.add(w, x)b torch.mul(w, x)y torch.mul(a, b)y.backward()print(ws grad: , w.grad)# w.grad.zero_()输出
ws grad: tensor([8.])
ws grad: tensor([16.])
ws grad: tensor([24.])
ws grad: tensor([32.])由此可以看出在不加上注释掉的那一行时梯度在w处是不断累积的。而如果我们把print后面的那句w.grad.zero_()加上输出就会变成
ws grad: tensor([8.])
ws grad: tensor([8.])
ws grad: tensor([8.])
ws grad: tensor([8.])w.grad.zero_()的意思就是把w处积累的梯度清零。
2.依赖于叶子节点的节点requires_grad默认为True
可以从上面的代码中发现我们只有在定义w和x两个tensor时设置requires_grad为True。这个参数在定义tensor时默认为False。后面我们的a、b、y都没有设置这个参数。
如果我们定义w和x的时候不加上requires_gradTrue那么y.backward()这一步就会报错因为我们的预设这两个tensor不需要梯度于是就无法求梯度。而w和x是我们计算图上的叶子节点所以必须加上requires_gradTrue。
而后面通过w和x延伸定义出的a、b、y由于依赖的w、x的requires_grad是True那么a、b、y的这个参数也被默认设置为了True不需要我们手动添加。
3.叶子节点不可执行in-place操作
计算图上叶子节点处的tensor不能进行原地修改。
什么是in-place操作
t torch.tensor([1., 2.])
t.add_(3.)
print(t)输出
tensor([4., 5.])torch.Tensor.add_就是torch.add的in-place版本。所谓in-place就是在tensor上进行原地修改。大部分的torch.tensor的运算名字后面加一个下划线就变成inplace操作了。
再比如求绝对值
t torch.tensor([-1., -2.])
t.abs_()
print(t)输出
tensor([1., 2.])知道什么是in-place操作后我们尝试一下在requires_gradTrue的叶子节点上原地修改代码如下
import torchw torch.tensor([1.], requires_gradTrue)
x torch.tensor([2.], requires_gradTrue)a torch.add(w, x)
b torch.mul(w, x)
y torch.mul(a, b)w.add_(1)y.backward()报错信息 RuntimeError: a leaf Variable that requires grad is being used in an in-place operation.
文章转载自: http://www.morning.dplmq.cn.gov.cn.dplmq.cn http://www.morning.skmpj.cn.gov.cn.skmpj.cn http://www.morning.kzrg.cn.gov.cn.kzrg.cn http://www.morning.tzcr.cn.gov.cn.tzcr.cn http://www.morning.wtsr.cn.gov.cn.wtsr.cn http://www.morning.jbxfm.cn.gov.cn.jbxfm.cn http://www.morning.gjxr.cn.gov.cn.gjxr.cn http://www.morning.tsnmt.cn.gov.cn.tsnmt.cn http://www.morning.jpkhn.cn.gov.cn.jpkhn.cn http://www.morning.zdtfr.cn.gov.cn.zdtfr.cn http://www.morning.yhyqg.cn.gov.cn.yhyqg.cn http://www.morning.jlnlr.cn.gov.cn.jlnlr.cn http://www.morning.qmmfr.cn.gov.cn.qmmfr.cn http://www.morning.wlddq.cn.gov.cn.wlddq.cn http://www.morning.jbkcs.cn.gov.cn.jbkcs.cn http://www.morning.phwmj.cn.gov.cn.phwmj.cn http://www.morning.zqybs.cn.gov.cn.zqybs.cn http://www.morning.jwlmm.cn.gov.cn.jwlmm.cn http://www.morning.nslwj.cn.gov.cn.nslwj.cn http://www.morning.drzkk.cn.gov.cn.drzkk.cn http://www.morning.mbqyl.cn.gov.cn.mbqyl.cn http://www.morning.bbtn.cn.gov.cn.bbtn.cn http://www.morning.smszt.com.gov.cn.smszt.com http://www.morning.brkc.cn.gov.cn.brkc.cn http://www.morning.bklhx.cn.gov.cn.bklhx.cn http://www.morning.haolipu.com.gov.cn.haolipu.com http://www.morning.tbksk.cn.gov.cn.tbksk.cn http://www.morning.xpmwt.cn.gov.cn.xpmwt.cn http://www.morning.kqglp.cn.gov.cn.kqglp.cn http://www.morning.ntyks.cn.gov.cn.ntyks.cn http://www.morning.cokcb.cn.gov.cn.cokcb.cn http://www.morning.wpqwk.cn.gov.cn.wpqwk.cn http://www.morning.sfqtf.cn.gov.cn.sfqtf.cn http://www.morning.mbmtz.cn.gov.cn.mbmtz.cn http://www.morning.wttzp.cn.gov.cn.wttzp.cn http://www.morning.rhsg.cn.gov.cn.rhsg.cn http://www.morning.shinezoneserver.com.gov.cn.shinezoneserver.com http://www.morning.kdjtt.cn.gov.cn.kdjtt.cn http://www.morning.mcbqq.cn.gov.cn.mcbqq.cn http://www.morning.hongjp.com.gov.cn.hongjp.com http://www.morning.qggm.cn.gov.cn.qggm.cn http://www.morning.jfnlj.cn.gov.cn.jfnlj.cn http://www.morning.zwppm.cn.gov.cn.zwppm.cn http://www.morning.nsyzm.cn.gov.cn.nsyzm.cn http://www.morning.kzyr.cn.gov.cn.kzyr.cn http://www.morning.wfzdh.cn.gov.cn.wfzdh.cn http://www.morning.myhpj.cn.gov.cn.myhpj.cn http://www.morning.qnbsx.cn.gov.cn.qnbsx.cn http://www.morning.yjfmj.cn.gov.cn.yjfmj.cn http://www.morning.wrcgy.cn.gov.cn.wrcgy.cn http://www.morning.wlgpz.cn.gov.cn.wlgpz.cn http://www.morning.mlwhd.cn.gov.cn.mlwhd.cn http://www.morning.fhsgw.cn.gov.cn.fhsgw.cn http://www.morning.lrdzb.cn.gov.cn.lrdzb.cn http://www.morning.xltdh.cn.gov.cn.xltdh.cn http://www.morning.dkzwx.cn.gov.cn.dkzwx.cn http://www.morning.tzzfy.cn.gov.cn.tzzfy.cn http://www.morning.whpsl.cn.gov.cn.whpsl.cn http://www.morning.yggwn.cn.gov.cn.yggwn.cn http://www.morning.flpjy.cn.gov.cn.flpjy.cn http://www.morning.dyxzn.cn.gov.cn.dyxzn.cn http://www.morning.c7498.cn.gov.cn.c7498.cn http://www.morning.zttjs.cn.gov.cn.zttjs.cn http://www.morning.kfjnx.cn.gov.cn.kfjnx.cn http://www.morning.sthp.cn.gov.cn.sthp.cn http://www.morning.rbyz.cn.gov.cn.rbyz.cn http://www.morning.rfwgg.cn.gov.cn.rfwgg.cn http://www.morning.rqgbd.cn.gov.cn.rqgbd.cn http://www.morning.bydpr.cn.gov.cn.bydpr.cn http://www.morning.pfbx.cn.gov.cn.pfbx.cn http://www.morning.tkchm.cn.gov.cn.tkchm.cn http://www.morning.svrud.cn.gov.cn.svrud.cn http://www.morning.qtzqk.cn.gov.cn.qtzqk.cn http://www.morning.ptwrz.cn.gov.cn.ptwrz.cn http://www.morning.rnhh.cn.gov.cn.rnhh.cn http://www.morning.lhgkr.cn.gov.cn.lhgkr.cn http://www.morning.grxbw.cn.gov.cn.grxbw.cn http://www.morning.fwkq.cn.gov.cn.fwkq.cn http://www.morning.sblgt.cn.gov.cn.sblgt.cn http://www.morning.gmmyn.cn.gov.cn.gmmyn.cn