如何验证pytorch,pytorch源码怎么看
在编程的过程中,我遇到了with torch.no_grad()的用法。刚想整理一下,发现了一些意想不到的东西,就录了下来。
首先解释一下环境。以下所有测试均在python3.6, pytorch1.2.0环境下进行。
官网截图如下:
有几个要点:
torch.no_grad之前的上下文管理器。如果确定Tensor.backward()不需要调用,可以使用torch.no_grad屏蔽torch.no_grad管理下计算的张量及其要求_
1.首先是最简单的。预期的importtorcha=torch . tensor([1.1],requires _ grad=True(b=a * 2 print)b)c=B2 print(c)CG rad _ fn=add backward 0(tensor(2 .))表示同时在张量中记录grad _ fn。
稍微改一下,看看用torch.no_grad()做什么。
importtorcha=torch . Tensor([1.1],Requires _ grad=true(b=a * 2 print)b)with torch.no_grad 3360 c=B2 prad grad _ fn=mul Backward 0)Tensor)[4.2000])False包含在with torch . no _ grad)中,Tensor c已使用C. Backward()运行时错误3360元素0 Oftensorsdoesnotrequiregrad和doesnothaveAgrad _ fn在本例中,
2.到目前为止,官网内容都差不多。我想如果张量C再参与运算,然后张量再传播回来,到达C会发生什么,所以我有下面的计算图和下面的代码:
importtorcha=torch . tensor([1.1],requires_grad=true(b=a * 2 print)b)with torch . no _ grad):C=B2 print(C)print)C . requires _ grad D print(e)print)e . requires _ grad(e . backward))print)a . grad)# answer grad _ fn=mul backward 0(tensor(4)张量e的requires _ grad是3358www在C之后,requires _ grad是False和D否则,一些张量斜率可能是意想不到的。
经过分析,在C中,不再跟踪斜率,到达此处时截断上游斜率。a不知道什么样的坡好,就投了无。
3.让A有另一条路。既然从C开始的斜率被切掉了,我就让A参加另一个运算,再加一条路径。此时,A的斜率会发生什么变化?所以有以下计算图和代码。
importtorcha=torch . tensor([1.1],requires _ grad=true(b=a * 2 print)b)with torch . no _ grad):c=B2 print(c)print)c . requires _ grad requad d print(e)print)e . requires _ grad(f=a eprint(f)f . f . backward)(print)a . grad)f)backward).grad _ fn=mulbackward 0(tensor(4.2000)false tensor))42。),grad _ fn=mul backward0) 43.1000
以下是预防措施的总结:
只要requires_grad=True,就必须是浮点数,不能是整数。Grad,否则会发生这种错误。运行时错误:onlytensofffloating pointdtypecanrequirements 2 . with torch.no_grad())你确定可以无后台使用,或者在显卡允许的情况下不使用with torch . no _ grad()。避免不必要的错误。3.实验结果表明,即使在withtorch.no_中包含了原地操作,也可以看到下面的例子:importtorch=torch.tensor ([1.1],Requires _ grad=true(b=a * 2 with torch。no _ grad(:b . mul _)2)print grad _ fn=mul backward 0)张量(2。))也许有人对第三点的总结表示怀疑,但其实一开始我并不认同。之后看了一下detach函数,突然明白了。因为就地操作是不改变内存地址的操作,所以它的值是直接用原来的内存地址改变的。所以b.mul_(2)不能改变b.grad=True的性质。也可以看出,内存中新生成的地址变量,用torch.no_grad():包含进去之后应该是可以工作的。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。