数值微分
1.requires_grad属性
每个张量有一个属性 requires_grad(默认为false,可以根据x.requires_grad_(True)方法来改变),设置为True,就会开始跟踪tensor的所有操作,完成后,可以调用.backward()自动计算所有梯度,并且梯度累积到.grad属性中
eg1
x=t.ones(5,3,requires_grad=True)#初始化张量的时候设置属性
y=x+2#因为y是由x变化而来,所以y已经有了grad_fn属性(此时用y产生别的张量,仍会不断保持记录)
z=y*y*3
out=z.mean()
out.backward()#向后传播。因为out为一个标量,这个out.backward()等同于out.backward(torch.tensor(1.))
x.grad#得到了d(out)/dx
eg2
x=t.rand(3,requires_grad=True)
y=x*2
while y.data.norm()<1000:#y的L2范数
y=y*2
print(y)
2backward()函数
当out为标量时候不需要加参数=参数为t.tensor(1.)
当out为1N的列向量时候,参数为t.tensor([k1,k2,k3,Kn])含义为:
当out为NN矩阵的时候参数为t.tensor([[],[],…])也是一个N*N的矩阵,
3 with t.no_grad()
将不想保持跟踪的部分放到 with t.no_grad():代码块中(其中涉及到的张量会自动放弃全部的requires_grad属性)
with t.no_grad():
y=x+2