如果out是个标量的话backward()里面就不用写了,也就是默认是1,大部分的loss都是这样的,这个比较简单了就不详解了。
以下博客内容部分参考自博客https://sherlockliao.github.io/2017/07/10/backward/
定义m=(m1,m2)=(2,3),
,记为k=(k1,k2)
计算k对于m1和m2的梯度:(m1,m2对应下图的x1,x2)
接下来使用代码来实现k对m1和m2的梯度
from torch.autograd import Variable as v
import torch
j = torch.zeros(2 ,3)
k = v(torch.zeros(1, 2))
m.grad.data.zero_()
k[0, 0] = m[0, 0] ** 2 + 3 * m[0 ,1]
k[0, 1] = m[0, 1] ** 2 + 2 * m[0, 0]
k.backward(torch.FloatTensor([[1, 1]]), retain_graph =True) # 需要san次反向求导
j[:,0]=m.grad.data
m.grad.data.zero_()
# [1, 0] dk0/dm0, dk1/dm0
k.backward(torch.FloatTensor([[1, 0]]), retain_graph =True) # 需要两次反向求导
j[:, 1] = m.grad.data
m.grad.data.zero_()
# [0, 1] dk0/dm1, dk1/dm1
k.backward(torch.FloatTensor([[0, 1]]))
j[:, 2] = m.grad.data
print('jacobian matrix is')
print(j)
输出:
分析一下: