Pytorch|Pytorch模型修改與特定層擷取

柯頌竹
Programming with Data
Jan 13, 2021

取出模型中特定層的輸出

方法一 :取出子 modules

以 torchvision.models 提供的 resnet18 模型為例子,首先先列出原本架構

我們希望能取出 layer4 的輸出,以便之後再接上自行設計的輸出:從上方可以看出 layer4 輸出為倒數第三層,因此我們可以將 model.children() 當 List 一樣操作。

sub_model = nn.Sequential(*list(model.children())[:-2])

如果只是要再接上自行設計的output,程式碼如下:

但如果forward 內有特殊操作如 reshape,squeeze,必須將每一個 module 單獨取出並從新定義 forward 內的操作,程式碼如下:

方法二 :register_forward_hook, register_backward_hook

register_forward_hook,register_backward_hook 顧名思義就是針對兩個函數自訂欲取出的內容,每當我們執行 model.forward(),model.backward() 被註冊的 hook 就會啟動。

如果我們想要知道每個子 module 的 output shape,程式碼如下:

權重初始化:Weight initialization

先自定義初始化方式函數,我們可以自行設計,又或是呼叫 torch.nn.init 內的 functions (連結),接著使用 nn.Module.apply (自定義 function)

查看模型結構 :torchsummary

PyTorch 提供了一個相當方便的接口讓我們能快速一覽模型的結構還有參數,包含

  • 每一個子 modules 的命名還有參數用量
  • 給定模型輸入,顯示每一層輸出的大小
  • 模型總參數用量
  • 預測模型大小
  • 輸入包含模型(nn.Modules) 以及 input_tensor

--

--

柯頌竹
Programming with Data

熱愛自由行、參觀各種形式的展覽,踏上過20個國家的領土。歡迎詢問各種在歐洲自由行的問題。偶爾分享一下資料分析的讀書筆記。