在bp
的時候,pytorch
是將variable
的梯度放在variable
物件中的,我們隨時都可以使用variable.grad
得到對應variable
的grad
。剛建立variable
的時候,它的grad
屬性是初始化為0.0
的。
import torch
from torch.autograd import variable
w1 = variable(torch.tensor([1.0,2.0,3.0]),requires_grad=true)#需要求導的話,requires_grad=true屬性是必須的。
w2 = variable(torch.tensor([1.0,2.0,3.0]),requires_grad=true)
print(w1.grad)
print(w2.grad)
variable containing:
0 00[torch.floattensor of size 3]
variable containing:
0 00[torch.floattensor of size 3]
從下面這兩段**可以看出,使用d.backward()
求variable
的梯度的時候,variable.grad
是累加的即:variable.grad=variable.grad+new_grad
d = torch.mean(w1)
d.backward()
w1.grad
variable containing:
0.3333
0.3333
0.3333
[torch.floattensor of size 3]
d.backward()
w1.grad
variable containing:
0.6667
0.6667
0.6667
[torch.floattensor of size 3]
既然累加的話,那我們如何置零呢?
w1.grad.data.zero_()
w1.grad
variable containing:
0 00[torch.floattensor of size 3]
# 獲得梯度後,如何更新
learning_rate = 0.1
#w1.data -= learning_rate * w1.grad.data 與下面式子等價
w1.data.sub_(learning_rate*w1.grad.data)# w1.data是獲取儲存weights的tensor
這裡更新的時候為什麼要用tensor
更新,為什麼不直接用variable
?
variable
更多是用在feedforward
中的,因為feedforward
是需要記住各個tensor
之間聯絡的,這樣,才能正確的bp
。tensor
不會記錄路徑。而且,如果使用variable
操作的話,就會造成迴圈圖了(猜測)。
如果每個引數的更新都要w1.data.sub_(learning_rate*w1.grad.data)
,那就比較頭疼了。還好,pytorch
為我們提供了torch.optim
包,這個包可以簡化我們更新引數的操作。
import torch.optim as optim
# create your optimizer
optimizer = optim.sgd(net.parameters(), lr = 0.01)
# in your training loop:
for i in range(steps):
optimizer.zero_grad() # zero the gradient buffers,必須要置零
output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step() # does the update
注意:torch.optim
只用於更新引數,不care梯度的計算。
backward(gradient=none, retain_variables=false)
引數:
gradient (tensor) – gradient of the differentiated function w.r.t. the data. required only if the data has more than one element
z.backword(gradient=grads)
上面**應該怎麼解釋呢? ∂
obj∂
z∂z∂
w=gr
ads∗
∂z∂w
PyTorch學習筆記(二) 變數
在 torch 中,variable 是乙個存放會變化的值 變數 的地理位置。可以理解為乙個容器,裡面的值會不停的變化,就像乙個裝雞蛋的籃子,雞蛋數會不停變動。那誰是裡面的雞蛋呢,自然就是 torch 的 tensor 如果用乙個 variable 進行計算,那返回的也是乙個同型別的 variabl...
Pytorch 學習筆記
本渣的pytorch 逐步學習鞏固經歷,希望各位大佬指正,寫這個部落格也為了鞏固下記憶。a a b c 表示從 a 取到 b 步長為 c c 2 則表示每2個數取1個 若為a 1 1 1 即表示從倒數最後乙個到正數第 1 個 最後乙個 1 表示倒著取 如下 陣列的第乙個為 0 啊,第 0 個!彆扭 ...
Pytorch學習筆記
資料集 penn fudan資料集 在學習pytorch官網教程時,作者對penn fudan資料集進行了定義,並且在自定義的資料集上實現了對r cnn模型的微調。此篇筆記簡單總結一下pytorch如何實現定義自己的資料集 資料集必須繼承torch.utils.data.dataset類,並且實現 ...