Python 模組 PyTorch 簡介與基礎語法
1140225 Meeting
封面圖片是 PyTorch 的官方 Logo , 2025 年 2 月 22 日擷取自 Github 。
前言
PyTorch 是基於 Python 語言所開發的開源機器學習庫,是目前廣受歡迎的深度學習框架之一。 PyTorch 的前身源自於多個研究機構和專案的技術累積,主要是由基於 Lua 語言的 Torch 函式庫與 Facebook 的人工智慧研究團隊 (Facebook Artificial Intelligence Research, FAIR, 現為 Meta AI) 所開發的跨平台高效能計算 Caffe2 高效能深度學習框架。 2017 年,微軟 (Microsoft) 、 Facebook 和 IBM 等公司合作開發開放神經網路交換格式 (Open Neural Network Exchange, ONNX) ,並以開放原始碼的方式託管於 Github ,使 PyTorch 可以與其他深度學習框架互通。
特性
PyTorch 相較於其他深度學習框架有以下的優勢和特性:
與 Python 的整合
PyTorch 使用 Python 作為主要 API,對其他 Python 模組,如 NumPy 和 SciPy 等模組的支援性非常好。同時由於 Pytorch 神經網路模組化的設計,我們可以建立線性層、卷積神經網路層 (CNN)、循環神經網路層 (RNN)、長短期記憶層 (LSTM) 等,簡單且快速的建立一個模型。
自動微分與梯度計算
為模型進行微分或進行梯度的計算往往是一件惱人的事,然而 PyTorch 的子模組 torch.autograd 能夠自動計算梯度。對於程式設計者而言,這無疑使各種深度學習和優化問題能夠以簡單、直觀的方式解決,我們僅僅需要在 Python 中寫下 .backward()
即可自動計算梯度,實現高效且準確的反向傳播。
GPU 加速運算
PyTorch 定義一個叫做張量 (Tensor) 的類別,用於儲存或計算多維度的數字陣列。Tensor 與 NumPy 的陣列格式相似,可以方便的與 NumPy 的陣列格式相互轉換。與 NumPy 不同的是, PyTorch 可以在支援 CUDA 的輝達 (Nvidia) GPU 上運作,只需要寫下 .to(device)
即可將 Tensor 或模型搬移到 GPU 進行相較於 CPU 更快速的運算。
兼容性
PyTorch 支援 ONNX ,可與其他深度學習框架互通,也可以方便的轉移、部屬到不同的環境、機器。
基礎語法
安裝 PyTorch
我們必須安裝 Python 才能使用 PyTorch 。以下使用 Python 和其模組管理系統 pip
示範安裝,如果有使用其他的 Python 發行版,如 Anaconda 等,請自行搜尋相關安裝方法。
我們可以在終端機輸入下方指令安裝 Pytorch ,或是參考官方文件 https://pytorch.org/get-started/locally/ 進行安裝。
|
|
安裝完成後,我們就可以在 Python 的終端機中載入 PyTorch 模組。
|
|
並檢視 PyTorch 的版本、是否安裝成功。
|
|
|
|
如果您有 Nvidia 所產的 GPU 且您的 GPU 支援 CUDA ,請您更新 GPU 驅動程式至最新版本,並由官方文件 https://pytorch.org/get-started/locally/ 取得安裝指令後於終端機進行安裝,方可調用 GPU 進行運算。
|
|
我們可以使用
|
|
檢視 CUDA 是否安裝成功且可被 PyTorch 讀取、使用。如果可用時將回傳 True
。
|
|
建立 Tensor
使用 PyTorch 時,我們可以新建一個 Tensor 並對其進行操作。
|
|
|
|
我們也可以將 NumPy 的 array 類別轉換為 Tensor 類別。
|
|
同理,我們也可以將 Tensor 類別轉換為 NumPy 的陣列類別。
|
|
其中 .cpu()
的作用是確保在轉換的過程中 Tensor 類別的資料可以由 GPU 複製到 CPU 再轉換,防止轉換錯誤。
GPU 加速
我們可以使用 .to("cuda")
將變數從 CPU 移動到 GPU。
|
|
|
|
然而,對於相同程式碼在不同的環境下執行時每次都要進行修改,這略顯麻煩。因此我們可以改寫如下,讓程式碼自動判別應該在什麼處理器下運行。
|
|
建立簡單的神經網路模型
在 Python 中可以使用 class
函數透過 PyTorch 建立一個神經網路模型,以下是一個範例。
|
|
上述範例建立了一個輸入為 2 維且輸出為 1 維的模型,適合用於簡單的二元分類問題。
成功建立模型後,如果執行環境支援 CPU 加速運算,我們可以將模型移動到 GPU 。
|
|
|
|
訓練模型
接下來,我們定義 criterion
和 optimizer
,分別是模型的損失函數以及梯度下降辦法。由於先前定義的模型是二元分類模型,這裡我們使用二元交叉熵損失函數 (Binary Cross Entropy Loss) 作為損失函數。梯度下降的學習率 (learning rate, lr) 則設為 0.01.
|
|
準備用於訓練的資料。
|
|
下面我們用簡單的迴圈訓練模型。
|
|
|
|
- 向前傳播 (Forward Propagation) 是指從輸入層開始,資料經過每一層的計算,直到輸出層。
- 反向傳播 (Backpropagation) 是訓練神經網路的重要算法,其目的在於計算並更新模型的權重 (weight) 和偏差 (bias) ,以最小化損失函數。
測試模型
假設我們有一組資料用於測試,則預測結果如下。
|
|
|
|
由於訓練的資料是 0 或 1 標籤的二元分類模型,因此我們可以設定由神經網路模型輸出結果小於 0.5 為標籤 0 ,大於 0.5 為標籤 1 ,以此完成分類。
這樣就完成簡單的神經網路模型建立了。
當然,越大量的訓練資料與更多的訓練次數都可能可以提升模型預測的準確率,但訓練時間也會因此而拉長。資料量、訓練次數與預測準確率並不是完全相關的,反而過多的資料量和訓練次數會造成預測準確率下降,這都是要進行取捨的。
結語
神經網路是現今機器學習、人工智慧的核心技術之一。隨著深度學習的發展,神經網路儼然成為許多先進技術的基礎,包括語音辨識、圖片辨識、時間序列預測、資料填補等應用。有著對神經網路的深入理解,我們可以嘗試建立更複雜的模型結構,並應用在更複雜的領域,嘗試讓神經網路為我們解決各種複雜的問題。
參考資料
- Get Started: Select preferences and run the command to install PyTorch locally, or get started quickly with one of the supported cloud platforms.(無日期)。PyTorch。2025年2月24日參考自 https://pytorch.org/get-started/locally/
- ONNX(2024年10月7日)。維基百科,自由的百科全書。2025年2月24日參考自 https://zh.wikipedia.org/zh-tw/ONNX
- PyTorch(2024年10月7日)。維基百科,自由的百科全書。2025年2月24日參考自 https://zh.wikipedia.org/wiki/PyTorch
- PyTorch(2025年2月24日)。Github。2025年2月24日參考自 https://github.com/pytorch/pytorch