pytorch的模型解析

2021-10-10 05:30:08 字數 2011 閱讀 5180

如何獲取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 每次迴圈開始之前,確保梯度的...