如何在 PyTorch 模型中列出並列印所有層(Layer)

如何在 PyTorch 模型中列出並列印所有層(Layer)

引言

在深度學習的熱門工具 PyTorch 中,你可能需要查看並列出模型的所有層。當你想了解模型如何組成、檢查其組件或直接處理特定層時,這就非常實用。本篇文章將介紹三種不同的方法來列出和顯示 PyTorch 模型中的所有層。此外,本文還會介紹一種在 GPU 雲端上執行 PyTorch 的絕佳方式。

理解 PyTorch 模型

在 PyTorch 模型中,不同層各自對輸入資料進行處理。這些層協同運作,構成了模型的架構(architecture)。在訓練過程中,某些層內的值會自行調整——這些稱為可訓練參數(trainable parameters),目的是讓模型隨著時間變得更加聰明。

PyTorch 模型架構的基本概念

在 PyTorch 中建立模型時,你需要擴展 nn.Module 類別來創建自己的結構。在此設定中,有一個必備方法稱為 forward。這個方法至關重要,因為它接收你的資料,然後依序將資料傳遞給模型的各個層,直到輸出結果。把每個層想像成獨立的小工作者,例如用於直連的 nn.Linear 或用作影像濾波的 nn.Conv2d

為了確保這些工作者依序正確排列並依序傳遞資料,我們使用 nn.Sequential 類別。有了這個方便的工具,你只需按資料處理順序列出層即可。就像是在對它們說:「你先來!現在換你!」直到每個部分都完成任務。

PyTorch 模型的主要組件

在 PyTorch 中,有幾個重要的部分特別關鍵。首先,我們有所謂的預訓練模型(pretrained model)。這基本上是一個已經在大量資料上訓練過、學到許多知識的現成模型。它因為記住了訓練時的權重和偏置而具備某些能力。當我們使用這些預訓練模型時,就是把它所學到的知識應用到手中的任務上。

設定 PyTorch 環境

在深入本部落格後面要討論的有趣內容之前,你得先準備好電腦環境。這表示要安裝一些東西,比如 Python、PyTorch 和 torchvision。

首先,Python 是你使用 PyTorch 進行深度學習時會用到的語言。請確保你的電腦上已安裝 Python。如果還沒有,請前往 Python 官方網站下載並安裝。

接下來是安裝 PyTorch 本身。它基本上是 PyTorch 深度學習世界的主角。它為你提供各種工具和資源,用來建立和訓練神經網路讓它們自行學習。要安裝到系統中,只需使用 pip 套件管理器執行 pip install torch

但等等——還有更多!你還需要 torchvision 加入工具集,因為如果處理影像讓你興奮,這個函式庫會為你提供一些好東西。像是預先做好的資料集或模型,它們對於視覺任務非常有用,還有調整影像以使其更適合訓練的方式;同樣地,pip 讓這裡變得很簡單:pip install torchvision

安裝 PyTorch

要在電腦上安裝 PyTorch,只需打開終端機或命令提示字元,輸入:

pip install torch

這會指示電腦下載並安裝最新版的 PyTorch。你需要穩定的網路連線,因為這可能需要一些時間。

驗證 PyTorch 安裝

要確認 PyTorch 已正確安裝,你可以嘗試執行一個基本的 Python 腳本,或在互動式環境(如 Jupyter Notebook 或 Python 的 REPL)中使用它。進入你喜歡的 Python 環境,然後用這行程式碼匯入 torch 模組:

import  torch

列出 PyTorch 模型中的層

在我們掌握了 PyTorch 模型的基本組成方式之後,現在來看看如何查看並列出所有的層。

使用 .children() 和 .modules() 方法

要顯示 PyTorch 模型中的每一層,我們可以搭配點記法使用 .children().modules() 方法。做法如下:

for name, module in model.named_modules():
    print(name, module)

上面的程式碼片段中,我們使用 named_modules() 方法來取得 PyTorch 模型的每個部分及其名稱。透過逐一迭代並顯示它們的名稱和內容,我們就能列出 PyTorch 設定的所有部分。

執行這段 Python 程式碼的輸出會是一個列表,顯示不同層的名稱以及它們的模組。當你想要深入研究特定層或對其進行修改時,這個資訊就非常有用。

列出層的實用範例

在處理 PyTorch 模型時,知道如何顯示並列出所有部分非常有幫助。這可以協助你更了解模型、調整模型的某些部分或除錯。以下是一些簡單的方法:

  • 要直接使用名稱存取特定部分:
  • 使用點記法,像這樣:model.layer1.0.relu
  • 如果你想逐一處理每個部分,可能順便進行修改:
  • 簡單的 for 迴圈可以讓你遍歷命名的模組,以便對它們進行個別處理。
  • 如果只是想查看有哪些部分以及它們的詳細資訊:
  • named_modules() 方法與 print 結合,可以同時取得模組的名稱和資訊。

列印層的詳細資訊

除了僅僅列出 PyTorch 模型中不同部分的名稱,你可能還想分享更多關於每個部分的資訊,包括它有多少設定以及其輸出結果為何。

存取特定層的資訊

如果你正在深入研究一個 PyTorch 模型,並想查看其層的詳細資訊,有一個方便的工具叫做 named_parameters 可以幫忙。這個函式的作用就像一張藏寶圖;它會引導你通過模型中所有命名的參數。透過這張地圖,你可以找到每個層的特定資訊。

運作方式如下:只需幾行程式碼,你就可以列印出關於每個層的所有資訊。

for name, parameter in model.named_parameters():
    print(name, parameter)

在這些程式碼行中,name 告訴我們正在檢視哪個層,而 parameter 則顯示該層的張量。這就像為你的 PyTorch 模型拍攝 X 光一樣——可以看到每個部分的構成,而無需實際拆開它!

除此之外,如果你喜歡冒險,或者需要對複雜任務或深度分析使用更友善的工具,請試試 ptrblck 函式庫。它專為與 PyTorch 模型中的張量和參數順利協作而設計,在處理複雜結構或需要深入了解各部分如何組合在一起時,可以讓事情變得更容易。

自訂函式來列印層

如果你想要查看 PyTorch 模型中的特定層或層組,你可以借助 PyTorch 和 Python 的力量,自己編寫函式。這些程式碼片段需要將你的模型作為輸入,然後只顯示你感興趣的層。

舉例來說,如果你有興趣查看某個模型中的所有卷積層,你可以這樣做:

def print_conv_layers(model):
    for name, module in model.named_modules():
        if isinstance(module, nn.Conv2d):
            print(name, module)

在這個函式中,我們遍歷模型中的每個已命名模組,並檢查它是否為 nn.Conv2d 類型。如果是,我們就可以看到它的名稱和內容。

進階技術

除了查看和列印 PyTorch 模型部分的簡單方法之外,還有一些更酷的技巧可以讓你進行更深入的研究。

迭代已命名的模組

當你處理 PyTorch 模型時,逐個迭代已命名的模組可以讓你對每個部分執行特定操作。你可以使用 named_modules 函式來實現這一點。它會提供一個迭代器,遍歷模型中每個已命名的模組。

使用這種方法,你可以深入並修改模型的特定部分。例如,如果你想要調整某個特定層,或檢查它的輸出以便進一步分析。

一個方便的方法是將這些模組放入一個字典中,這樣只需知道其名稱就能很容易地找到並處理任何模組。做法如下:

named_modules_dict = dict(model.named_modules())
conv1 = named_module_dict['conv1']

在上面的範例中,conv1 指向名為 ‘conv1’ 的模組。現在你已經直接從列表中取得了它,對它執行任何需要的操作都變得簡單。

使用鉤子(Hooks)提取層的輸出

在 PyTorch 中,鉤子讓你可以設定一些特殊的函式,這些函式會在模型運行的特定時間被呼叫。就像在電玩遊戲中設定檢查點一樣,某些特定事件會發生。如果你想要查看模型內部某些部分的運作情況,這些鉤子就非常有用。

要讓這些鉤子生效,首先你得寫一個函式。這不是普通的函式;它需要四個參數:module、input、output 和 context。其中最重要的部分是 output,因為這讓你能夠查看層輸出的內容,並在必要時進行修改。

以下是如何創建一個鉤子函式:

def hook_fn(module,input,output):
    # 對輸出做任何處理
    print(output)

寫好函式後,接下來要將它附加到模型中的層上。你可以對任何感興趣的層呼叫 register_forward_hook

layer.register_forward_hook(hook_fn)

設定好一切之後,現在每當那段特定的程式碼在前向傳播期間執行時——砰!你自訂的小函式就會被啟動,讓你可以立即修改或僅僅觀察輸出。

使用 Novita AI GPU 實例加速 PyTorch

Novita AI GPU Instance 是一個雲端解決方案,在這一領域是卓越的服務。它提供對 NVIDIA RTX 3090 GPU 的存取,這款 GPU 以能夠處理密集的計算工作負載而聞名。這對於需要 GPU 提供的額外運算能力,但不想投資本地硬體的 PyTorch 使用者來說特別有幫助。

以下是 Novita AI GPU Instance 如何與 PyTorch 整合以提升效率:

計算加速: PyTorch 與 CUDA 支援的 GPU(如 Novita AI GPU Instance 提供的 RTX 3090)無縫整合,可加速模型訓練和推論。PyTorch 的 .to(device) 方法確保模型和張量能夠有效傳輸到 GPU,釋放深度學習所需的平行處理能力。

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

彈性擴展: Novita AI GPU Instance 提供根據專案需求上下調整資源的靈活性。這表示在運算需求高的時期,可以分配更多 GPU 資源;任務完成後,可以釋放這些資源,從而最佳化成本。

成本效益: 像 Novita AI GPU Instance 這樣的雲端服務採用按用量付費的定價模式,確保使用者只為他們消耗的資源付費。這對於運算需求波動,或僅需短時間運算高峰的專案來說,特別具有成本效益。

結論

了解 PyTorch 模型的不同部分,對於良好地分析和調整你的模型非常重要。透過使用像 .children().modules() 這樣的工具,列出並列印每一層相當直接,這有助於你了解模型的組成方式。如果你需要每個層的更特定細節,可以建立自訂函式進行更深入的分析。熟練這些方法意味著你將能更好地處理 PyTorch 模型,讓你的深度學習專案變得更酷。

Novita AI 是一個一站式雲端平台,助力你的 AI 抱負。整合 API、無伺服器、GPU 實例——你需要的經濟高效工具。消除基礎設施負擔,免費開始,讓你的 AI 願景成為現實。

推薦閱讀:

  1. CUDA 12:最佳化 GPU 運算效能
  2. 微調 Llama 的快速簡易指南