還不會使用PyTorch框架進行深度學習的小夥伴,看過來
這是一篇關於使用 PyTorch 框架進行深度學習的教程,讀完以後你可以輕鬆地將該框架應用於深度學習模型。
今年初,Facebook 推出了 PyTorch 1.0,該框架集成了谷歌雲、AWS和 Azure機器學習。學習本教程之前,你需要很熟悉 Scikit-learn,Pandas,NumPy 和 SciPy。這些程式包是使用本教程的重要先決條件。
教程大綱
-
何為深度學習?
-
Pytorch 簡介
-
相較於其它 Python深度學習庫,Pytorch 有何優勢?
-
Pytorch 的張量
-
Pytorch Autograd 機制
-
Pytorch 的 nn 模組
-
Pytorch optim 包
-
Pytorch 中的自定義 nn 模組
-
總結和延伸閱讀
何為深度學習?
ofollow,noindex" target="_blank"> 深度學習 是機器學習的一個子領域,其演算法受到了人類大腦工作機制的啟發。這些演算法被稱為人工神經網路。這樣的神經網路包括用於影象分類的卷積神經網路、人工神經網路和迴圈神經網路。
Pytorch 簡介
Pytorch 是一個基於 Torch 的 Python機器學習包,而 Torch 則是一個基於程式語言 Lua 的開源機器學習包。Pytorch 有兩個主要的特點:
-
利用強大的 GPU 加速進行張量計算(如 NumPy)
-
用於構建和訓練神經網路的自動微分機制
相較於其它 Python深度學習庫,Pytorch 有何優勢?
相比其它深度學習庫,Pytorch 具有以下兩點優勢:
1. 與TensorFlow 等其它在執行模型之前必須先定義整個計算圖的庫不同,PyTorch 允許動態定義圖。
2. PyTorch 也非常適合深度學習研究,提供了最大的靈活性和執行速度。
PyTorchTensors
Pytorch張量
PyTorch張量與 NumPy 陣列非常相似,而且它們可以在 GPU 上執行。這一點很重要,因為它有助於加速數值計算,從而可以將神經網路的速度提高 50 倍甚至更多。為了使用 PyTorch,你需要先訪問其官網並安裝 PyTorch。如果你正在使用 Conda,你可以通過執行以下簡單命令來安裝 PyTorch:
為了定義 PyTorch張量,首先需要匯入 torch 包。PyTorch 允許你定義兩種型別的張量,即 CPU 和 GPU張量。在本教程中,假設你執行的是使用 CPU 進行深度學習運算的機器,但我也會向你展示如何在 GPU 中定義張量:
PyTorch 的預設張量型別是一個浮點型張量,定義為「torch.FloatTensor」。例如,你可以根據 Python 的 list 資料結構建立張量:
如果你使用的是支援 GPU 的機器,你可以通過以下方法定義張量:
你也可以使用 PyTorch張量執行加法和減法等數學運算:
你還可以定義矩陣並執行矩陣運算。我們來看看如何定義一個矩陣然後將其轉置:
Pytorch Autograd 機制
PyTorch 使用了一種叫做「自動微分」的技術,它可以對函式的導數進行數值估計。自動微分在神經網路中計算反向傳遞(backward pass)。在訓練過程中,神經網路的權重被隨機初始化為接近零但不是零的數。「反向傳遞」是指從右到左調整權重的過程,而正向傳遞則是從左到右調整權重的過程。
「torch.autograd」是 PyTorch 中支援自動微分的庫。這個包的核心類是「torch.Tensor」。如果你想要跟蹤這個類的所有操作,請將「.requires_grad」設定為 True。如果要計算所有的梯度,請呼叫「.backward()」。這個張量的梯度將在「.grad」屬性中
如果你想要從計算曆史中分離出一個張量,請呼叫「.detach()」函式。這也可以防止將來對張量的計算被跟蹤。另一種防止歷史跟蹤的方法是用「torch.no_grad()」方法封裝程式碼。
你可以將張量「Tensor」和函式「Function」類相連線,構建一個編碼了完整計算曆史的無環圖。張量的「.grad_fn」屬性會引用建立了這個張量的「Function」。如果你要計算導數,可以呼叫張量的「.backward()」。如果該張量包含一個元素,你不需要為「backward()」函式指定任何引數。如果張量包含多個元素,你需要指定一個規模(shape)相匹配的張量的梯度。
例如,你可以建立兩個張量,將其中一個張量的「requires_grad」設定為 True,將另一個的設定為 False。接著你可以用這兩個張量來執行加法和求和運算。然後你可以計算其中一個張量的梯度。
在「b」上呼叫「.grad」的返回值為空,因為你沒有將它的「requires_grad」設定為 True。
Pytorch 的 nn 模組
這是在 Pytorch 中構建神經網路的模組。「nn」模組依賴於「autograd」來定義模型並對其進行微分處理。首先,定義訓練一個神經網路的過程:
1. 用一些可學習的引數(即權重)定義神經網路
2. 在輸入的資料集上進行迭代
3 通過網路處理輸入
4. 將預測結果和實際值進行比較,並測量誤差
5. 將梯度傳播回網路的引數中
6. 使用簡單的更新規則更新網路的權重:
weight = weight—learning_rate * gradient
現在,你可以使用「nn」程式包建立一個雙層的神經網路:
在這裡我們將解釋一下上面用到的引數:
-
N 是批處理大小。批處理大小是觀測資料的數量,觀測之後權重將被更新。
-
D_in 是輸入的維度
-
H 是隱藏層的維度
-
D_out 是輸出層的維度
-
torch.randn 定義了指定維度的矩陣
-
torch.nn.Sequential 初始化了神經網路層的線性堆疊
-
torch.nn.Linear 對輸入資料應用了線性變換
-
torch.nn.ReLU 在元素層級上應用了 線性整流函式
-
torch.nn.MSELoss 建立了一個標準來度量輸入 x 和目標 y 中 n 個元素的均方誤差
PyTorch optim 包
接下來,你要使用 optim 包來定義一個優化器,該優化器將為你更新權重。optim 包抽象出了優化演算法的思想,並提供了常用優化演算法(如 AdaGrad、RMSProp 和 Adam)的實現。我們將使用 Adam優化器,它是最流行的優化器之一。
該優化器接受的第一個引數是張量,這些張量需要更新。在正向傳遞中,你要通過向模型傳遞 x 來計算出預測的 y。然後,計算並顯示出損失。在執行反向傳遞之前,你要將使用優化器更新的所有變數的梯度設定為零。這樣做的原因是,預設情況下,在呼叫「.backward()」方法時,梯度不會被重寫。然後,你需要在優化器上呼叫「step」函式,該步驟會更新其引數。具體的實現程式碼如下所示:
PyTorch 中自定義的 nn 模組
有時你需要構建自己的自定義模組。這種情況下,你需要建立「nn.Module」的子類,然後定義一個接收輸入張量併產生輸出張量的 forward。使用「nn.Module」實現雙層網路的方法如下圖所示。這個模型與上面的模型非常相似,但不同之處在於你要使用「torch.nn.Module」建立神經網路。另一個區別是這個模型會使用 stochastic gradient descent optimizer 而不是 Adam。你可以使用下面的程式碼實現一個自定義的 nn 模組:
總結和延伸閱讀
Pytorch 允許你實現不同型別的神經網路層,例如:卷積層、迴圈層、線性層。你可以從其官方文件中瞭解更多關於 Pytorch 的資訊。
你還可以在「Hacker News」和「Reddit」上討論這篇部落格。
如果你想知道更多關於 PyTorch 如何為機器學習專案賦能的資訊,可以檢視下面的 Heartbeat 資源:
-
通過 Pytorch 實現神經網路風格遷移
-
地址:https://heartbeat.fritz.ai/neural-style-transfer-with-pytorch-49e7c1fe3bea
-
通過 Pytorch 實現基本的影象分類
-
地址:https://heartbeat.fritz.ai/basics-of-image-classification-with-pytorch-2f8973c51864
-
通過「TensorFlow Mobile」在安卓系統上部署 Pytorch 和 Keras
-
地址:https://heartbeat.fritz.ai/deploying-pytorch-and-keras-models-to-android-with-tensorflow-mobile-a16a1fb83f2
-
想要入門移動機器學習嗎?加入 Heartbeat 的 Slack 小組吧!
-
地址:https://heartbeat.fritz.ai/join-the-conversation-heartbeats-new-slack-community-620000da5819
原文連結:https://heartbeat.fritz.ai/introduction-to-pytorch-for-deep-learning-5b437cea90ac