什么是pytorch,python与pytorch的区别
打算分析一下张量的源码,但是一看这个部门的源码基本都是在C上实现的,目前精力有限,还是算了吧。现在,我打算分析一下张量可能难以使用的方法,比如克隆和分离。
这些方法很难用,主要是张量支持自动微分。即每个张量既可以表示这个张量对应的值,也可以表示以这个张量为根节点的前面计算图。
方法克隆首先看PyTorch的官方文档,torch.clone—pytorch 1.10.0文档。
很多人可能不知道克隆这个词是可微的。其实这就是偶尔在论文中看到的identify操作。这里有一个例子。
importtorchx=torch . tensor([1.0],requires _ grad=true)y=x . clone(y . backward))print) x . grad 3360为此需要clone。
或者y=x ^ 0,y=x*1。
importtorchx=torch . tensor([1.0],requires _ grad=True)y=x0y . backward)(print)、x.grad3360)、x.grad
下面,以计算图表的形式:
(当前计算图的节点表示运算(叶子的节点除外),边表示快乐级数)。
Etach方法Detach也是一种张量方法,它与计算图形紧密相关。
首先我们来看看PyTorch的官方文档:torch . tensor . detach—py torch 1 . 10 . 0文档。
一个新的张量,etachedfromthecurrentgraph。结果将永不恢复梯度。返回了returnedtensorsharesthamestorangewithttheoriginalone . in-1。
也就是说,detach的作用是将张量的requirements _ grad设置为False。张量的requirements _ grad为假在这个计算图上会有什么影响?有效地,以张量为根节点的计算子图在反向传播中得不到梯度。
现在我们来看一个例子。
importtorch#L=(xy )Z#dL/dX=Z,dL/dY=Z,dl/dz=xyx=torch.tensor([1.0]),requires _ grad=true rue requires _ grad=true)K=X YL=K * ZL . backward)(print)(X y . grad(print)(Z.grad:),Z . grad)))
Importtorch#L=(xy )Z#dL/dX=Z,dL/dY=Z,dl/dz=xyx=torch.tensor([1.0]),requires _ grad=true y . grad(print)(Z . grad:Z . grad)
即由于K.detach,当前计算中k的demands _ grad为假,所以dL/dK的梯度无法传播到k,dL/dX和dL/dY无法计算。
但是注意,K.detach()并不修改k本身的requires_grad属性,所以k本身可以接收渐变。
再举一个例子:
importtorch#L=(xy )3z ) dL/dY=3Z、dL/dY=3Z、dL/dY=3Z ) x=torch.tensor([1.0],requires _)requires _ grad=true(z=torch . tensor([3.0],requires _ grad=true)K=X YL=K . detach)* z * KL . back backward
所以如果你想让所有的计算从K开始没有梯度,你应该首先使用K=K.detach()。
所以请参考detach这个方法其实可以理解为在本次计算中让某个变量变为常数。。
目前克隆和分离的原理分析是清晰的,但具体的使用场景需要在实践中观察。以后看了再补充。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。