backward與自動求導詳解
阿新 • • 發佈:2019-02-10
匯入
首先匯入模組
import torch
from torch.autograd import Variable
標量
設定requires_grad=True
x=Variable(torch.Tensor([10]),requires_grad=True)
y=x*5
y.backward()
print x.grad
Variable containing:
5
[torch.FloatTensor of size 1]
輸出y是一個標量,所以backward()
不需要引數
再次反向傳播
y.backward()
print x.grad
Variable containing:
10
[torch.FloatTensor of size 1]
x.grad
進行了累加
向量
x=Variable(torch.Tensor([2,3]),requires_grad=True)
y=x*5
y.backward(torch.Tensor([2,3]))
print x.grad
Variable containing:
10
15
[torch.FloatTensor of size 2]
y1=5*x1
y2=5*x2
backward
傳入torch.Tensor([2,3])
,即y=2*y1+3*y2,y=10*x1+15*x2,
再分別求導得到10,15。
再次反向傳播,x.grad
進行了累加。
y.backward(torch.Tensor([2,3]))
print x.grad
Variable containing:
20
30
[torch.FloatTensor of size 2]
backward( )
,必須傳入引數,並且維度和y一致。
retain_variables=True
x=Variable(torch.Tensor([2,4]),requires_grad=True)
y=x*5
y[0] = x[ 0] ** 2 + 3 * x[1]
y[1] = x[ 1] ** 2 + 2 * x[0]
y.backward (torch.FloatTensor([1, 0]))
print x.grad
x.grad.data.zero_()
求導時,對y0求得,2*x0+3,
對y1求導為,2*x1+2,
這裡都用到了x0,x1,一般反向傳播後都會釋放掉,所以再次傳播需要設定retain_variables
y.backward(torch.FloatTensor([1, 0]),retain_variables=True)