对Pytorch中张量及求导操作的总结

Pytorch张量及求导操作总结分享

1、x.grad

假设x是定义的tensor值,那么可以调用x.grad来查看其对应的导数值,需要注意的是:(1)grad也是tensor类型,其数值类型默认为torch.float32,一个张量在其刚被定义时grad为None;
(2)作为tensor类型,grad既可以查看也可以赋值,但其形状和数据类型必须与张量x一致;
(3)作为tensor类型,grad也可以定义它自己的grad,同时也能声明requires_grad为True,你可以用x.grad.grad查看二级导数,不过实际开发时一般用不上这些。

2、x.requires_grad

(1)它是张量的一个属性,只有张量被定义为浮点类型或混合型(complex)时才会有,换句话说整型张量是不能声明求导的,但可以有导数值即上面的grad,且根据上面讲的导数值与原始张量类型一致的原则,整型的导数也必须为整型(同样是存在但实际一般用不到);
(2)requires_grad是对当前张量是否求导的一个标志,它不会影响导数值,只会在backward时决定是否对其求导,一个可以反向传播的神经网络运算图中至少需要有一个声明求导的叶结点,否则反向传播无法进行。

3、clone()和detach()

(1)x.clone()用于将当前张量x的数据复制给一个新张量,不会复制其导数部分,但新张量也具备导函数,名称为<CloneBackward>,此导函数能够说明新张量的形成方式,但新张量没有自己的导数,当它被求导时,其导数值会在x.grad中加和;
(2)类似的共享梯度的方式还有slice、reshape等操作,实现上述操作后新张量的导函数分别为<ReshapeAliasBackward>、<SliceBackward>,它们反映了新张量的由来,同时也根据相应关系构成了到原始张量x的导数映射。类似的还有<SelectBackward>、<RepeatBackward>、<ReshapeAliasBackward>等,它们都是由相应操作获得的新张量而建立,都会和原始张量共享梯度,且梯度均保存在原始张量中,上述操作都是深度学习开发的基本操作,也在神经网络数据流的形成中起着重要作用;
(3)x.detach()用于将新张量的梯度同张量x分离,即令新张量不再影响x的导数,新张量的requires_grad行为默认为False,导数也为None. 但此时若改变新张量的某个值,则x也会相应改变,若要得到独立的新张量则务必使用clone()函数,它可以与detach()连用。
注:张量的slice、select、reshape(需在张量具备连续条件下,即stride与size具备一致性stride[i]=stride[i+1]*size[i+1])、transpose操作不会复制元素,即改变新或原张量任意一个共享位置的值都会造成对应值改变,而cat、repeat有类似clone的效果,新旧张量的值不会互相影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值