假设p(p1,p2,p3)=f(x1,x2,x3)的函数,tensor[p1,p2,p3]分别对tensor[x1,x2,x3]的求导,[x1,x2,x3]是个有多个元素(x1,x2,x3)的张量。 import torch import torch.nn.functional as F torch.manual_seed(10) a=torch.rand(1,3) print(a) J=torch.zeros(3,3) a.requires_grad_()#前面定义 p=F.softmax(a,dim=1) #我这里用的是softmax,你可以用别的函数 #前面定义a=torch.rand(1,3),不是a=torch.rand(3),所以dim=1 print(p) p.backward(torch.Tensor([[1,0,0]]),retain_graph=True) #下面重复使用backward(),需要retain_graph=True #[[1,0,0]] 指定位于第一位置即P1对(x1,x2,x3)求导 J[0]=a.grad a.grad=torch.zeros_like(a.grad)#下面继续backward,防止梯度累加,要清0 p.backward(torch.Tensor([[0,1,0]]),retain_graph=True) J[1]=a.grad a.grad=torch.zeros_like(a.grad) p.backward(torch.Tensor([[0,0,1]])) J[2]=a.grad print(J) # 上面是backward 求,下面是autograd 求 torch.manual_seed(10) b=torch.rand(3) b.requires_grad_() print(b) p=F.softmax(b,dim=0) print(p) print(torch.autograd.grad(p[0],[b],retain_graph=True)) #注意是[b]不是b,把b变成一个1*3的向量 print(torch.autograd.grad(p[1],[b],retain_graph=True)) print(torch.autograd.grad(p[2],[b]))
非标量张量(Tensor)求导的两种python实现方式
于 2021-09-04 12:56:18 首次发布