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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pytorch 笔记——tensor
- 下一篇: pytorch笔记——简易回归问题