pytorch Variable与Tensor合并后requires_grad()默认与修改方法
导读:本文共2516字符,通常情况下阅读需要8分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: pytorch更新完后Variable与Tensor合并了。现在torch.Tensor()能像Variable一样进行反向传播的更新,返回值为Tensor,Variable自动创建tensor,且返回值为Tensor,(所以以后不需要再用Variable)。Tensor创建后,默认requires_grad=Flase,可以通过xxx.requires_gra... ...
目录
(为您整理了一些要点),点击可以直达。pytorch更新完后Variable与Tensor合并了。现在torch.Tensor()能像Variable一样进行反向传播的更新,返回值为Tensor,Variable自动创建tensor,且返回值为Tensor,(所以以后不需要再用Variable)。Tensor创建后,默认requires_grad=Flase,可以通过xxx.requires_grad_()将默认的Flase修改为True。来看看官方文档是怎么介绍的吧。
结果如下:
tensor([[1., 2., 3.],
[4., 5., 6.]])
False
True
创建一个Variable,Variable必须接收Tensor数据 不能直接写为 a=Variable(range(6)).reshape((-1,3))
否则报错 Variable data has to be a tensor, but got range
结果:
tensor([[0., 1., 2., 3.],
[4., 5., 6., 7.]])
False
True
由上面可以看出,Tensor完全可以取代Variable。
或者直接用Tensor创建时给定requires_grad=True
结果
tensor([[1., 2., 3.],
[4., 5., 6.]], requires_grad=True)
True
True
补充:volatile 和 requires_grad在pytorch中的意思
pytorch的BP过程是由一个函数决定的,loss.backward(), 可以看到backward()函数里并没有传要求谁的梯度。那么我们可以大胆猜测,在BP的过程中,pytorch是将所有影响loss的Variable都求了一次梯度。
但是有时候,我们并不想求所有Variable的梯度。那就要考虑如何在Backward过程中排除子图(ie.排除没必要的梯度计算)。
如何BP过程中排除子图? Variable的两个参数(requires_grad和volatile)
requires_grad=True 要求梯度
requires_grad=False 不要求梯度
volatile=True相当于requires_grad=False。反之则反之。。。。。。。ok
注意:如果a是requires_grad=True,b是requires_grad=False。则c=a+b是requires_grad=True。同样的道理应用于volatile
也许有人会问,梯度全部计算,不更新的话不就得了。
这样就涉及了效率的问题了,计算很多没用的梯度是浪费了很多资源的(时间,计算机内存)
pytorch Variable与Tensor合并后requires_grad()默认与修改方法的详细内容,希望对您有所帮助,信息来源于网络。