pytorch基础知识整理(一)自动求导机制
torch.autograd
torch.autograd是pytorch最重要的組件,主要包括Variable類和Function類,Variable用來封裝Tensor,是計算圖上的節點,Function則定義了運算操作,是計算圖上的邊。
1.Tensor
tensor張量和numpy數組的區別是它不僅可以在cpu上運行,還可以在GPU上運行。
tensor其實包含一個信息頭和一個數據存儲類型torch.Storage,torch.Storage是一個單一數據類型的連續一維數組。可以用tensor.is_contiguous()檢驗張量的數據存儲是否是在連續內存上,tensor必須連續才能夠使用view操作改變tensor形狀,如果不連續則可以使用tensor.contiguous()使之連續。
2.Variable
注:自Pytorch0.4.0版本之后,variable類型和tensor類型合并,在代碼中不用再把tensor轉換為variable。
在計算圖中,只要有一個節點使用了requires_grad=True,它的后續關聯節點都會成為requires_grad=True,就是說都需要計算梯度。可以
var = Variable(tensor, volatile=True)只要有一個節點使用volatile=True整個計算圖就不會調用.backward(),用于推理過程。
注意在Variable不支持inplace運算操作,因為這樣導致變量值被更改,反向傳播的時候無法再使用,因此為了避免計算錯誤,計算圖中出現inplace操作時, pytorch會報錯。
可用tensor.is_leaf()判斷某個變量在計算圖中是否是葉子節點,只有葉子節點會保留grad,其他張量不保留,如果非葉子節點需要保留梯度,則使用tensor.retain_grad()即可。
2.1 .backward()對計算圖進行反向傳播更新梯度
對于計算圖中的一個標量,比如損失函數的輸出loss,可以直接進行.backward()操作。如果是一個張量,比如中間過程,則必須指定和該張量同形狀的grad_tensor,具體涉及到反向傳播過程(復合函數鏈式法則求偏導)的jacobian矩陣。
2.2 torch.nn.Parameter()
Parameter是Variable的子類,但parameter類會出現在模型的參數列表中(即會出現在model.parameters()迭代器中),且parameter類默認requires_grad=True,且不能設置volatile。
2.3 凍結網絡部分參數
可以用detach()把張量從計算圖中分離出來,分離出來的變量不求梯度,可以用來凍結部分網絡權重參數(代碼示例待補充)。也可以通過設置網絡前面部分參數的requires_grad=False來凍結網絡。
3.Function
Function是對Variable進行的運算,定義了forward()方法和backward()方法。可以與nn.Module()對比來理解。兩者都可以實現運算,但是Function無法保存參數,用于不需要更新參數的操作,例如各種激活函數、池化等運算,而Module可以保存參數,則用于線性層、卷積層等運算。使用Function自定義運算時必須重寫forward()和backward()方法,而使用Module自定義運算時,只需要寫forward()即可,backward()可由Module中的各種組件自動求解了。
總結
以上是生活随笔為你收集整理的pytorch基础知识整理(一)自动求导机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytorch基础知识整理(二)数据加载
- 下一篇: pytorch基础知识整理(三)模型保存