首页 > 编程知识 正文

验证码 pytorch,pytorch是啥

时间:2023-05-05 08:45:53 阅读:175236 作者:176

在编程过程中遇到了with torch.no_grad ()的使用方法,刚想整理一下,发现了意想不到的东西,所以记录下来。

首先说明环境。 以下所有测试均在python3.6, pytorch1.2.0环境中进行。

官方网站截图如下:

有几个主要点:

torch.no_grad之前的上下文管理者。 如果确定不需要调用Tensor.backward (),则可以使用torch.no_grad来屏蔽在torch.no_grad管理下计算的tensor及其requires_

1 .首先是最简单的,预期的importtorcha=torch.tensor ([ 1.1 ],requires_grad=true(b=a*2print ) b ) c=b2print(c ) c grad_fn=addbackward0(tensor(2. ) )指示grad_fn同时被记录在tensor b和c中,并且他们的requires_grad为True,并且c将反向传播

稍微更改一下,看看with torch.no_grad ()发挥的功能。

importtorcha=torch.tensor ([ 1.1 ],requires_grad=true(b=a*2print ) b ) with torch.no _ grad 3360 c=B2 prad grad_fn=MulBackward0) tensor ) [4.2000] ) False包括在with torch.no_grad )中,tensor c已经在这种情况下使用c.backward () runtime error 3360 element0oftensorsdoesnotrequiregradanddoesnothaveagrad _ fn

2 .到目前为止官网的内容都差不多了,我想如果tensor c又参与了运算,之后tensor反向传播的时候,传到c这里会发生什么,所以有了下面的计算图和下面的代码:

importtorcha=torch.tensor ([ 1.1 ], requires_grad=true(b=a*2print ) b ) with torch.no_grad ) :c=b2print(c ) print ) c.requires _ grad requad dprint(e ) print ) e.requires _ grad (e.backward ) ) print ) a.grad ) # answer grad _ fn=mul backward0(tensor (4) requires_grad为False的c和requires_grad为3358www.Sina.com/的d运算后得到的tensor e的requires_grad为3358www 因此,官方网站表示,只有在不需要backward的情况下才使用with torch.no_grad ()。 否则,某些tensor坡度可能会出乎意料

分析起来,在c中坡度不再被追踪,上游的坡度传到这里就相当于被切断了,a也不知道该有什么样的坡度好,投了None。

3 .让a有另一条路径既然从C开始的坡度被切断了,我就让a参加另一个运算,增加另一条路径。 此时,a的坡度会怎么样? 因此,有以下计算图和代码。

importtorcha=torch.tensor ([ 1.1 ], requires_grad=true(b=a*2print ) b ) with torch.no_grad ) :c=b2print(c ) print ) c.requires _ grad requad dprint(e ) print ) e.requires _ grad (f=a eprint (f ) f.f.backward ) (print ) a.grad ) f ) backward )。 grad_fn=mulbackward0(tensor (4.2000 ) falsetensor ) ) 42.),grad _ fn=mul backward0) 43.1000

这里总结一下注意事项:

只要requires_grad=True的量,他就必须是浮点数,不是整数。 grad否则也会发生这样的错误。 runtime error : onlytensorsoffloatingpointdtypecanrequiregradients2. with torch.no _ grad () ) ) 您确信没有后台就可以使用,或者在显卡允许的情况下不使用with torch.no_grad ()。 避免发生不必要的错误3 .实验结果显示,即使in place操作包含在withtorch.no_中,也可以看到以下示例: importtorcha=torch.tensor ([ 1.1 ],requires _ grad=true (b=a*2with torch.no _ grad (: b.mul _ )2) print grad_fn=MulBackward0) tensor(2. ) )也许有人对第三点的总结表示怀疑,但其实一开始我并不认同。 之后,我看了detach函数,突然明白了。 由于in-place操作是不变更存储器地址的操作,所以用原来的存储器地址直接变更其值。 因此,b.mul_(2)不能改变b.grad=True的性质。 由此也可以看出,包含在with torch.no_grad () :中后,内存中新生成的地址变量应该会起作用。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。