Pytorch|Pytorch模型修改與特定層擷取
取出模型中特定層的輸出
方法一 :取出子 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