當前位置:
首頁 > 知識 > 還不會使用PyTorch框架進行深度學習的小夥伴,看過來

還不會使用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 模塊

總結和延伸閱讀

何為深度學習?

深度學習是機器學習的一個子領域,其演算法受到了人類大腦工作機制的啟發。這些演算法被稱為人工神經網路。這樣的神經網路包括用於圖像分類的卷積神經網路、人工神經網路和循環神經網路。

Pytorch 簡介

Pytorch 是一個基於 Torch 的 Python 機器學習包,而 Torch 則是一個基於編程語言 Lua 的開源機器學習包。Pytorch 有兩個主要的特點:

利用強大的 GPU 加速進行張量計算(如 NumPy)

用於構建和訓練神經網路的自動微分機制

相較於其它 Python 深度學習庫,Pytorch 有何優勢?

相比其它深度學習庫,Pytorch 具有以下兩點優勢:

1. 與 TensorFlow 等其它在運行模型之前必須先定義整個計算圖的庫不同,PyTorch 允許動態定義圖。

2. PyTorch 也非常適合深度學習研究,提供了最大的靈活性和運行速度。

PyTorch Tensors

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 模塊:


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

百聯X機器之心新零售人工智慧實驗室合作夥伴招募計劃啟動!
要玩轉這個星際爭霸II開源AI,你只需要i5+GTX1050

TAG:機器之心 |