pytorch(二)------2.3自动求梯度

加油加油加油

概念

像我这样的小白不太能够理解,但是先向下看这些例子,然后再来理解这些概念,就感觉easy些了。

require_grad属性:是否需要追溯此tensor的梯度;
.backward():对其进行反向传播;
.grad属性:反向传播后,tensor的梯度;
grad_fn属性:变量是怎么来的,手动创建的tensor为none,其余的都不为空;
torch.ones_like(input):返回一个张量,值为1,大小与input相同;
.backward(torch.ones_likes(y)):torch.ones_likes(y)若tensor对tensor求导,则必须引入此参数;若scalar对tensor求导,不用引入此参数;
x*y:矩阵相乘就是对应位置相乘;
torch.matmul(x,y):表示矩阵相乘;

1.tensor 对 tensor代码部分
向量不能对向量求导,要想实现向量对向量求导必须先设置一个权重系数v,v与y同形的向量;
J为雅可比矩阵(向量与向量求导结果为一个雅可比矩阵);
在这里插入图片描述

x=torch.tensor([1.,2.,3.],requires_grad=True)
#写成浮点形式的;
y=torch.tensor([4,5,6])
print(x,y)
z=x+y
print(z)
t=2*z
t.backward(torch.ones_like(t))
# 向量对向量求导需要引入troch.ones_like(),即grad_tensor属性;
#若标量对于向量的求导,则不用引入;
print(x.grad,x.grad_fn)

运行结果

tensor([1., 2., 3.], requires_grad=True) tensor([4, 5, 6])
tensor([5., 7., 9.], grad_fn=<AddBackward0>)
tensor([2., 2., 2.]) None

2.scalar对tensor代码部分:

x=torch.tensor([1.,2.,3.],requires_grad=True)
print(x)
out1=x.mean()
print(out1)
out1.backward()
#标量对于向量求导,不需要设置参数;
print(x.grad)

运行结果:

tensor([1., 2., 3.], requires_grad=True)
tensor(2., grad_fn=<MeanBackward0>)
tensor([0.3333, 0.3333, 0.3333])

3.梯度不清零代码实现:
每次反向传播过程中都是累加的,意味着每一次运行反向传播,梯度都会累加之前的梯度,所以一般都会在反向传播之前把梯度清零;

out2=x.sum()
print(out2)
out2.backward()
print(x.grad)
#梯度是累加的;会将上一次求导的关于x的梯度累加到此;

运行结果:


```python

```python
tensor(6., grad_fn=<SumBackward0>)
tensor([1.3333, 1.3333, 1.3333])

4.梯度清零代码操作

x=torch.tensor([1.,2.,3.],requires_grad=True)
print(x)
out1=x.mean()
print(out1)
out1.backward()
#标量对于向量求导,不需要设置参数;
print(x.grad)
x.grad.data.zero_()
#梯度清零;
out2=x.sum()
print(out2)
out2.backward()
print(x.grad)

运行结果:

tensor([1., 2., 3.], requires_grad=True)
tensor(2., grad_fn=<MeanBackward0>)
tensor([0.3333, 0.3333, 0.3333])
tensor(6., grad_fn=<SumBackward0>)
tensor([1., 1., 1.])

5.梯度中断:

x=torch.tensor([1.,2.],requires_grad=True)
y1=2*x
with torch.no_grad():
    y2=3*x
# 上下文管理器,被with框起来的不会被追踪;
y=y1+y2
y.backward(torch.ones_like(y))
print(x.grad)
print(x.requires_grad)
print(y1,y1.requires_grad)
print(y2,y2.requires_grad)
#  不会被追踪
print(y,y.requires_grad)

运行结果:

tensor([2., 2.])
True
tensor([2., 4.], grad_fn=<MulBackward0>) True
tensor([3., 6.]) False
tensor([ 5., 10.], grad_fn=<AddBackward0>) True

6.想要更改tensor的数值又不想影响backward:
通过tensor.data进行操作;

tensor向量可以使用+=进行赋值:

x=torch.tensor([1,2,3])
x+=1
print(x)

自动求导的不能进行+=,若想更改tensor的值必须要通过.data:

x=torch.tensor([1.,2.,3.],requires_grad=True)
print(x.data)
y=2*x
x.data*=2
#  只改变值,并不会记录在反向图中,所以不会影响到梯度传播;
y.backward(torch.ones_like(y))
print(x)
print(x.grad)

运行结果:

tensor([1., 2., 3.])
tensor([2., 4., 6.], requires_grad=True)
tensor([2., 2., 2.])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值