pytorch之求导

单变量求导:

x=Variable(torch.FloatTensor([3]),requires_grad=True) #requires_grad=True设置可以自动求导
y= x**2
y.backward() 
print(x.grad) #注意:求导之后的值是保存在variable的x.grad中的

矩阵求导

m = Variable(torch.FloatTensor([[2, 3]]), requires_grad=True) # 构建一个 1 x 2 的矩阵
n = Variable(torch.zeros(1, 2)) # 构建一个相同大小的 0 矩阵
n[0, 0] = m[0, 0] ** 2
n[0, 1] = m[0, 1] ** 3

n.backward(torch.ones_like(n)) # 将 (w0, w1) 取成 (1, 1) 见图1,一定要注意这里backward中的参数,一般矩阵求导都是把所有的w设置为1,这样就是把m当作一个自变量而n为因变量就像x和y。y对x求导,得到的还是一个和x一样大小的矩阵。

print(m.grad)

图1

多个目标求偏导:


x=Variable(torch.FloatTensor([2,3,4]),requires_grad=True)

k=Variable(torch.zeros(2))
print(x)
k[0] = x[0]**2+x[1]*3+x[2]*4
k[1] = x[0]*2 + x[1]**2+x[2]**2
print(k)

j=torch.zeros(2,3)
k.backward(torch.FloatTensor([1,0]), retain_graph=True)  #这里torch.FloatTensor([1,0])哪个为1就是对谁求偏导,
j[0] = x.grad.data

x.grad.data.zero_() # 归零之前求得的梯度

k.backward(torch.FloatTensor([0,1]))
j[1] = x.grad.data


print(j)

总结:backward(gradient=None, retain_variables=False)中的两个参数:
1.retain_variables是用来设置是否允许重复求导的,当设置为True时可以多次求导,但是会累加,所以在多目标函数多变量求偏导时要设置为True且每次求完导后要将变量导数值清零:x.grad.data.zeros_().
2.gradient参数:当处理单目标函数时,一般不用设置该参数。对多目标函数需要设置,其值为一个和因变量大小相同的tensor变量即Y=[y1,y2,…],用来保存各个偏导,但是注意的是,如果要对某一个yi求偏导,则对应的位置为1其他为0,如上述例子中k.backward(torch.FloatTensor([1,0]),)就是只对k[0]求梯度,值保存在x.grad.data中,当再对其他ki求导时需要清零。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值