Pytorch學習記錄-使用Pytorch進行深度學習,60分鐘閃電戰(zhàn)02

首頁.jpg

Autograd:自動求導

PyTorch中所有神經(jīng)網(wǎng)絡的核心是autograd包。我們首先簡要地看看,然后訓練第一個神經(jīng)網(wǎng)絡。
Autograd包為Tensors所有操作提供了自動求導。這是一個逐個運行的框架,這意味著用戶的BP反向傳遞是由代碼運行方式定義,并且每個迭代都不同。

Tensor

幾個重要的類和參數(shù)
torch.Tensor是Autograd的核心類,如果設置參數(shù).requires_grad為True,將會開始追蹤Tensor的所有操作。當完成計算后,可以使用.backward()并自動獲取所有梯度計算。Tensor的梯度將被匯集到.grad參數(shù)中。
如果想阻止Tensor追蹤歷史記錄。

  • 可以調用.detach(),將其從歷史記錄中分離出來,并且能夠防止將來的計算被追蹤。
  • 可以調用torch.no_grad()來包裹代碼,在評估模型時會有用,因為模型可能具有requires_grad = True的可訓練參數(shù),但我們不需要漸變。

還有一個重要的類,F(xiàn)unction。

autograd

可以通過屬性** .data 來訪問原始的tensor,而關于這一Variable的梯度則集中于 .grad **屬性中。
Tensor和Function相互連接并構建一個無環(huán)圖,這個圖能夠編碼一個完整的計算歷史。每一個Tensor都有一個.grad_fn參數(shù),這個參數(shù)可以引用已創(chuàng)建的Tensor中的Function(除非用戶創(chuàng)建的 Tensor中參數(shù).grad_fn為None)。

如果如果要計算導數(shù),可以在Tensor上調用.backward()。如果Tensor是標量,(即它包含一個元素數(shù)據(jù)),則不需要為backward()指定任何參數(shù),但是如果它有更多元素,則需要指定一個漸變參數(shù),該參數(shù)是匹配形狀的張量。

下面來試試grad_fn

#創(chuàng)建一個tensor,設定requires_grad=True來追蹤計算
x=torch.ones(2,2,requires_grad=True)
print(x)

#進行tensor操作
y=x+2
print(y)
#查看y的grad_fn
print(y.grad_fn)
#完成更多的操作
z=y*y*3
out=z.mean()
print(z, z.grad_fn,out)

.requires_grad_(...) 能夠更改現(xiàn)有的Tensor的requires_grad標志。如果沒有給出,輸入標志默認為False。

a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)

梯度

開始BP反向傳遞,因為out包括了一個單獨scalar,out.backward()和out.backward(torch.tensor(1.))相同。

out.forward()
print(x.grad)

你應該有一個含有4.5的矩陣。我們稱之為“Tensor”。
在數(shù)學上,如果你有一個向量值函數(shù),那么相對于的漸變是一個Jacobian matrix:一般來說,torch.autograd是一個Jacobian matrix的引擎。也就是說,給定任何向量,計算結果。如果恰好是標量函數(shù)的梯度,也就是說,那么通過鏈規(guī)則,Jacobian matrix乘積將是相對于的梯度:(注意,給出一個可以被視為列向量的行向量通過服用。)
上面這段在原教程中有點問題,總之就是pytorch包含有一個自動求導的核心功能,在Jacobian matrix同樣適用。

現(xiàn)在讓我們看一下Jacobian matrix的例子

x=torch.randn(3,requires_grad=True)
y=x*2
while y.data.norm()<1000:
    y=y*2

print(y)

v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)

print(x.grad)

print(x.requires_grad)
print((x ** 2).requires_grad)

with torch.no_grad():
    print((x ** 2).requires_grad)
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容