pytorch學習筆記(二) gradient

2021-07-28 16:50:10 字數 2927 閱讀 7957

bp的時候,pytorch是將variable的梯度放在variable物件中的,我們隨時都可以使用variable.grad得到對應variablegrad。剛建立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之間聯絡的,這樣,才能正確的bptensor不會記錄路徑。而且,如果使用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類,並且實現 ...