日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

pytorch笔记——autograd和Variable

發布時間:2025/4/5 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch笔记——autograd和Variable 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 autograd

1.1?requires_grad

tensor中會有一個屬性requires_grad 來記錄之前的操作(為之后計算梯度用)。

1.2?調整tensor的requires_grad

1.3 with torch.no_grad

?在這個環境里面里面生成的式子將無requires_grad

1.4 detach

?內容不變,但是requires_grad將變為False

2 Variable

一般pytorch里面的運算,都是Variable級別的運算

Variable 計算時, 它一步步默默地搭建著一個龐大的系統, 叫做計算圖(computational graph)。

這個圖是將所有的計算步驟 (節點) 都連接起來。最后進行誤差反向傳遞的時候, 一次性將所有 variable 里面的修改幅度 (梯度) 都計算出來, 而 普通的tensor 就沒有這個能力。

2.1?獲取variable里面的數據

直接print(variable)只會輸出 Variable 形式的數據, 在很多時候是用不了的(比如想要用 plt 畫圖), 所以我們要轉換一下, 將它變成 tensor 形式,或者ndarray形式等。

3 autograd 流程

3.1 無梯度的葉子節點

import torch a = torch.tensor(2.0) b = torch.tensor(3.0) c = a*b c.backward() a.grad,b.grad ''' RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn '''

前項的計算圖如下:

每個方框代表一個tensor,其中列出一些屬性(還有其他很多屬性):

data?tensor的data
grad當計算gradient的時候將會存入此函數對應情況下,這個tensor的gradient
grad_fn指向用于backward的函數的節點
is_leaf判斷是否是葉節點
requires_grad

如果是設為True,那么在做backward時候將作為圖的一部分參與backwards運算,

如果為False則不參加backwards運算

在上圖中,此時由于requires_grad都為False,因此沒有backwards的graph.

3.2 有梯度的葉子節點

?

a = torch.tensor(2.0,requires_grad=True) b = torch.tensor(3.0) c = a*b c.backward() a.grad,b.grad #(tensor(3.), None)

前饋流程圖如下:

?3.2.1 backward 后饋流程圖

1)? ??當我們調用tensor的乘法函數時,同時調用了隱性變量 ctx (context)變量的save_for_backward 函數。這樣就把此函數做backward時所需要的從forward函數中獲取的相關的一些值存到了ctx中。

? ? ? ? ?ctx起到了緩存相關參數的作用,變成連接forward與backward之間的緩存站。

?????????ctx中的值將會在c 做backwards時傳遞給對應的Mulbackward 操作.
2)? ? ?由于c是通過?c=a*b運算得來的, c的grad_fn中存了做backwards時候對應的函數.且把這個對應的backward 叫做 “MulBackward”? ??

3)? ?當進行c的backwards的時候,其實也就相當于執行了 c = a*b這個函數分別對 a 與b 做的偏導。?

????????那么理應對應兩組backwards的函數,這兩組backwards的函數打包存在 MulBackward的 next_functions 中。

????????next_function為一個 tuple list, AccumulateGrad 將會把相應得到的結果送到 a.grad中和b.grad中

4)? ?于是在進行 c.backward() 后, c進行關于a以及關于b進行求導。

????????由于b的requires_grad為False,因此b項不參與backwards運算(所以,next_function中list的第二個tuple即為None)。

????????c關于a的梯度為3,因此3將傳遞給AccumulaGrad進一步傳給a.grad
????????因此,經過反向傳播之后,a.grad 的結果將為3

3.3?稍微復雜一點的

a = torch.tensor(2.0,requires_grad = True) b = torch.tensor(3.0,requires_grad = True) c = a*b d = torch.tensor(4.0,requires_grad = True) e = c*d e.backward() a.grad,b.grad,d.grad #(tensor(12.), tensor(8.), tensor(6.))

  • e的grad_fn 指向節點 MulBackward, c的grad_fn指向另一個節點 MulBackward
  • c 為中間值is_leaf 為False,因此并不包含 grad值,在backward計算中,并不需要再重新獲取c.grad的值, backward的運算直接走相應的backward node 即可
  • MulBackward 從 ctx.saved_tensor中調用有用信息, e= c+d中 e關于c的梯度通過MulBackward 獲取得4. 根據鏈式規則, 4再和上一階段的 c關于 a和c關于b的兩個梯度值3和2相乘,最終得到了相應的值12 和8
  • 因此經過backward之后,a.grad 中存入12, b.grad中存入 8

參考資料:【one way的pytorch學習筆記】(四)autograd的流程機制原理_One Way的博客-CSDN博客

總結

以上是生活随笔為你收集整理的pytorch笔记——autograd和Variable的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。