加油加油加油
概念
像我这样的小白不太能够理解,但是先向下看这些例子,然后再来理解这些概念,就感觉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.])