如何獲取pytorch的動態圖?
model = torch.jit.load("test.pth")
graph = model.graph.copy()
torch._c._jit_pass_inline(graph)
node_list = graph.nodes()
載入模型後,獲取模型的graph,這個graph就是需要的動態圖。graph node就是計算圖的計算節點(有序),關於各個層的相關引數都可以從node節點中獲取,各個引數的相對位置需要查詢一下該op的實現。
需要注意的是,需要使用 _jit_pass_inline來將graph的sub module展開。
如何獲取pytorch的權重等引數?
對於非量化模型:
可以通過named_parameters或者state_dict獲取。
對於量化模型:
在一次次的嘗試和介面的設定中終於找到了!!!
a = 0
for model_name, module in model.named_modules():
print(model_name)
print(module)
if a == 2:
mod_c = module._c
#print(mod_c.dump())
param = module.__getattr__('_packed_params')
print(param)
print(type(param))
print(dir(param))
print(param._method_names())
weight,bias = param.unpack()
print(bias)
break
else:
a = a + 1
首先可檢視model的各個attribute的內容,方便後續直接getattr,這個過程可通過_c屬性獲得,然後將獲得的屬性值dump出來就可檢視各個子module的所有內容,然後根據需要就可以獲取想要的屬性了。
解析時遇到以下問題:
1、權重的layout如何確定?
通過shape屬性可以獲取tensor的shape,通過tensor.storage()可以獲取tensor裡的值,通過tensor.layout可以獲取資料布局。也就是說這個tensor的值是通過.layout的布局方式來排列,並沒有按照shape的順序來排列。
解析的模型layout是torch.strided,這種布局是按照stride來排列的,這種解釋還是比較模糊。
假設3x3卷積的權重的shape為[32,3,3,3](nchw),通過tensor.stride()就可以獲取各個維度的stride資訊。權重的stride資訊為[27,1,9,3](nchw),含義是:每跨乙個n,步長為27,每跨乙個c,步長為1,每跨乙個h,步長為9,每跨乙個w,步長為3。這樣也就意味著排列順序是nhwc,所以解析的時候需要按照框架要求進行轉換。
2、權重是int8,解析後的框架是uint8,如何使之能適用於uint8的框架?
看了下量化計算的實現:如果計算是需要減去zeropoint,即計算的時候使用value-zeropoint的值參與計算,那麼就可以將權重的所有值都加乙個128(int8最小值為-128),zeropoint的值也得加128就可以了
3、quant和dequant op做了啥事情?
pytorch的每個量化tensor存的資料其實還是float資料,在通過storage獲取資料時會將其按照scale/zeropoint量化成int8資料。
quant op做的事情:input / scale + zeropoint,將float轉換為uint8資料,再將uint8資料反量化後存下來:(input - zeropoint) * scale。即quant op做了量化反量化的事情,將乙個float tensor轉換為乙個int8 scale tensor。
dequant op就做了乙個反量化操作:(input - zeropoint) * scale
pytorch設計模型
1.nn.modulelist使對於加入其中的子模組,不必在forward中依次呼叫 nn.sequentialt使對於加入其中的子模組在forward中可以通過迴圈實現呼叫 2.pytorch中nn.modulelist和nn.sequential的用法和區別 nn.sequential定義的網路...
pytorch中的Variable 解析
variable就是變數的意思。實質上也就是可以變化的量,區別於int變數,它是一種可以變化的變數,這正好就符合了反向傳播,引數更新的屬性。pytorch都是由tensor計算的,而tensor裡面的引數都是variable的形式。如果用variable計算的話,那返回的也是乙個同型別的variab...
Pytorch 四 訓練模型
1.在前三部分已經分別完成了資料的處理 神經網路的定義,還有優化器 損失函式的選擇,這次我們將開始學習如何訓練模型。2.模型的訓練其實也是套路,大致分為一下五個部分。1 載入trainloader中的資料,並將其轉換為variable 形式的資料,作為神經網路的輸入。2 每次迴圈開始之前,確保梯度的...