Pytorch中使用backward 求導詳解

2021-10-03 12:39:24 字數 3856 閱讀 7595

backward()是pytorch中用來求梯度的方法,可以分為三種情況來使用。

此時可以直接使用out.backwark():

import torch

from torch.autograd import variable

#生成乙個內容為[2,3]的張量,varibale 預設是不要求梯度的,如果要求梯度,

#需要加上requires_grad=true來說明

#這裡的variable是為了設定變數,把a0=2,a1=3設定為兩個變數

a = variable(torch.tensor([2

,3])

,requires_grad=

true

)b = a+

3c = b*

3out=c.mean(

)#求均值

out.backward(

)print

("a="

,a)print

("out="

,out)

print

(a.grad)

#求out對a的偏導

結果為

a= tensor([2

.,3.

], requires_grad=

true

)out= tensor(

16.5000

, grad_fn=

)tensor(

[1.5000

,1.5000

])

將上面的程式寫成數學表示式就是:

求偏導的過程為:

#生成乙個內容為[2,4]的張量,varibale 預設是不要求梯度的,如果要求梯度,

#需要加上requires_grad=true來說明

a = variable(torch.tensor([[

2,4]

]),requires_grad=

true

)b = torch.zeros(1,

2)b[0

,0]= a[0,

0]**2

+a[0,1

]b[0,

1]= a[0,

1]**3

+a[0,0

]out =2*b

#括號裡面的引數要傳入和out維度一樣的矩陣

#這個矩陣裡面的元素會作為最後加權輸出的權重係數

out.backward(torch.floattensor([[

1,2]

]))print

("a="

,a)print

("out="

,out)

print

(a.grad)

#求out對a的偏導

結果為:

a= tensor([[

2.,4

.]], requires_grad=

true

)out= tensor([[

16.,132.]

], grad_fn=

)tensor([[

12.,194.]

])

將上面的程式寫成數學表示式就是:

a 0=

2,a1

=4a_0=2,a_1=4

a0​=2,

a1​=4b0

=a02

+a1b_0=a_0^2+a_1

b0​=a0

2​+a

1​b 1=

a0+a

13b_1=a_0+a_1^3

b1​=a0

​+a1

3​o ut

0=2b

0=2a

02+2

a1out_0=2b_0=2a_0^2+2a_1

out0​=

2b0​

=2a0

2​+2

a1​out

1=2b

1=2a

0+2a

13out_1=2b_1=2a_0+2a_1^3

out1​=

2b1​

=2a0

​+2a

13​∂ou

t∂a=

[∂ou

t0∂a

0∂ou

t0∂a

1∂ou

t1∂a

0∂ou

t1∂a

1]=[

82296

]\frac=\begin \frac &\frac \\ \frac& \frac \end=\begin 8 & 2 \\ 2 & 96 \end

∂a∂out

​=[∂

a0​∂

out0

​​∂a

0​∂o

ut1​

​​∂a

1​∂o

ut0​

​∂a1

​∂ou

t1​​

​]=[

82​2

96​]

這兒有個疑問,為什麼上面的程式計算出來是[12,194]呢?大家可以看到這一行傳進去的兩個引數[1,2]

out.backward(torch.floattensor([[

1,2]]))

有:

[ 12

]∗[8

2296]

=[12194

]\begin 1 & 2 \end*\begin 8 & 2 \\ 2 & 96 \end=\begin 12 & 194 \end

[1​2​]

∗[82

​296

​]=[

12​1

94​]

import torch

from torch.autograd import variable

#生成乙個內容為[2,3]的張量,varibale 預設是不要求梯度的,如果要求梯度,

#需要加上requires_grad=true來說明

a = variable(torch.tensor([[

2,3]

,[1,

2]])

,requires_grad=

true

)w = variable(torch.ones(2,

1),requires_grad=

true

)out = torch.mm(a,w)

#括號裡面的引數要傳入和out維度一樣的矩陣

#這個矩陣裡面的元素會作為最後加權輸出的權重係數

out.backward(torch.floattensor([[

1],[

1]])

)print

("gradients are:{}"

.format

(w.grad.data)

)

結果為:

gradients are:tensor([[

3.],

[5.]

])

在Pytorch中使用tensorboard

在pytorch中使用tensorboard的方法也挺簡單,如果要看網路結構和訓練損失的話基本上和在tf中使用是差不多的。import torch.nn as nn import torch.nn.functional as f import torch.optim as optim import ...

PyTorch中使用指定的GPU

pytorch預設使用從0開始的gpu,如果gpu0正在執行程式,需要指定其他gpu。有如下兩種方法來指定需要使用的gpu。1.類似tensorflow指定gpu的方式,使用cuda visible devices。1.1 直接終端中設定 cuda visible devices 1 python ...

PyTorch中使用指定的GPU

pytorch預設使用從0開始的gpu,如果gpu0正在執行程式,需要指定其他gpu。有如下兩種方法來指定需要使用的gpu。1.類似tensorflow指定gpu的方式,使用cuda visible devices。1.1 直接終端中設定 cuda visible devices 1 python ...