日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch基础知识整理(一)自动求导机制

發布時間:2025/3/8 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch基础知识整理(一)自动求导机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

torch.autograd

torch.autograd是pytorch最重要的組件,主要包括Variable類和Function類,Variable用來封裝Tensor,是計算圖上的節點,Function則定義了運算操作,是計算圖上的邊。

1.Tensor
tensor張量和numpy數組的區別是它不僅可以在cpu上運行,還可以在GPU上運行。
tensor其實包含一個信息頭和一個數據存儲類型torch.Storage,torch.Storage是一個單一數據類型的連續一維數組??梢杂胻ensor.is_contiguous()檢驗張量的數據存儲是否是在連續內存上,tensor必須連續才能夠使用view操作改變tensor形狀,如果不連續則可以使用tensor.contiguous()使之連續。

2.Variable
注:自Pytorch0.4.0版本之后,variable類型和tensor類型合并,在代碼中不用再把tensor轉換為variable。

var = Variable(tensor, requires_grad=True)

在計算圖中,只要有一個節點使用了requires_grad=True,它的后續關聯節點都會成為requires_grad=True,就是說都需要計算梯度??梢?/font>

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來凍結網絡。

model = torchvision.models.resnet18(pretrained=True) for param in model.parameters():param.requires_grad = False model.fc = nn.Linear(512, 100) optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)

3.Function
Function是對Variable進行的運算,定義了forward()方法和backward()方法??梢耘cnn.Module()對比來理解。兩者都可以實現運算,但是Function無法保存參數,用于不需要更新參數的操作,例如各種激活函數、池化等運算,而Module可以保存參數,則用于線性層、卷積層等運算。使用Function自定義運算時必須重寫forward()和backward()方法,而使用Module自定義運算時,只需要寫forward()即可,backward()可由Module中的各種組件自動求解了。

總結

以上是生活随笔為你收集整理的pytorch基础知识整理(一)自动求导机制的全部內容,希望文章能夠幫你解決所遇到的問題。

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