PyTorch進階之路(一):張量與梯度
PyTorch 是 Facebook 開發和維護的一個開源的神經網路庫,近來的發展勢頭相當強勁,也有越來越多的開發者為其撰寫 教程 ,本文也是其中之一。這是「PyTorch: Zero to GANs」系列教程的第一篇,介紹了 PyTorch 模型的基本構件: 張量 和梯度。
完整系列教程包括:
-
PyTorch 基礎:張量&梯度(本文)
-
線性迴歸 & 梯度下降 :https://medium.com/jovian-io/linear-regression-with-pytorch-3dde91d60b50
-
用 Logistic 迴歸進行分類:https://medium.com/jovian-io/image-classification-using-logistic-regression-in-pytorch-ebb96cc9eb79
-
未完待續.. (神經網路、CNN、RNN、GAN 等)
本系列教程旨在讓使用者更好地利用 PyTorch 學習深度學習和神經網路。本文將介紹 PyTorch 模型的基本構件:張量和梯度。
系統設定
本教程採用程式碼優先的方法來學習 PyTorch,你應該嘗試自己執行和實驗程式碼。我們將使用 Python 的 Anaconda 分佈來安裝程式碼庫並管理虛擬環境。對於互動式編碼和實驗,我們將使用 Jupyter notebook。本系列所有教程的 Jupyter notebook 都可從 Jovian(Jupyter 的共享協作平臺)上獲取。本文的 notebook 可以從以下地址獲得:https://jvn.io/aakashns/e5cfe043873f4f3c9287507016747ae5
通過在 Jupyter 內部直接執行單個命令,Jovian 使得在雲端共享 Jupyter notebook 變得很容易。它還可以捕獲你執行 notebook 所需的 Python 環境和庫,因此任何人(包括你自己)都能復現你的研究。
操作步驟如下:
1. 根據以下指南安裝 Anaconda。你可能還要將 Anaconda 二進位制檔案新增到 PATH 系統中,以便能夠執行 conda 命令列工具。
指南地址:https://conda.io/projects/conda/en/latest/user-guide/install/index.html
2. 通過在 Mac/Linux 終端或 Windows 命令提示符下執行以下命令(不要$)來安裝 jovian Python 庫:
$ pip install jovian --upgrade
3. 使用 jovian clone 命令下載本文的 notebook:
$ jovian clone e5cfe043873f4f3c9287507016747ae5
這樣做可以建立目錄 01-pytorch-basics,包含 Jupyter notebook 和 Anaconda 環境資料夾。
$ ls 01-pytorch-basics 01-pytorch-basics.ipynbenvironment.yml
4. 現在我們可以開啟目錄,使用 conda 通過單個命令安裝所需的 Python 庫(Jupyter、PyTorch 等):
$ cd 01-pytorch-basics $ conda env update
5. 通過執行以下命令,啟用虛擬環境:
$ conda activate 01-pytorch-basics
對於舊版 conda 的安裝,你可能需要執行命令:source activate 01-pytorch-basics。
6. 一旦激活了虛擬環境,我們通過執行以下命令來啟動 Jupyter:
$ jupyter notebook
7. 現在,你可以通過點選終端上顯示的連結或訪問 http://localhost:8888 來訪問 Jupyter 的 web 介面。
然後,你可以點選 01-pytorch-basics.ipynb 資料夾,開啟它然後執行程式碼。如果想自己輸入程式碼,你還可以通過點選「New」鍵來建立新的 notebook。
首先匯入 PyTorch:
張量
本質上來說,PyTorch 是一個處理張量的庫。一個張量是一個數字、向量、矩陣或任何 n 維陣列。我們用單個數字建立一個張量:
4. 是 4.0 的縮寫。它用來表示你想建立浮點數的 Python(和 PyTorch)。我們可以通過檢查張量的 dtype 屬性來驗證這一點:
我們可以試著建立複雜一點的張量:
張量可以有任何維數。每個維度有不同的長度。我們可以用張量的.shape 屬性來檢視每個維度的長度。
張量運算和梯度
我們可以將張量與常用的算數運算相結合。如下:
我們已經建立了 3 個張量:x、w 和 b。w 和 b 有額外的引數 requires_grad,設定為 True。一會兒就可以看看它能做什麼。
通過結合這些張量,我們可以建立新的張量 y。
如預期所料,y 是值為 3 * 4 + 5 = 17 的張量。PyTorch 的特殊之處在於,我們可以自動計算 y 相對於張量(requires_grad 設定為 True)的導數,即 w 和 b。為了計算導數,我們可以在結果 y 上呼叫.backward 方法。
y 相對於輸入張量的導數被儲存在對相應張量的.grad 屬性中。
如預期所料,dy/dw 的值與 x 相同(即 3),dy/db 的值為 1。注意,x.grad 的值為 None,因為 x 沒有將 requires_grad 設為 True。w_grad 中的「grad」代表梯度,梯度是導數的另一個術語,主要用於處理矩陣。
與 Numpy 之間的互操作性
Numpy 是 Python 中用於數學和科學計算的流行開源庫。它支援在大型多維陣列上進行高效運算,擁有一個支援多個庫的大型生態系統。這些庫包括:
-
用於畫圖、視覺化的 Matplotlib
-
用於影象和視訊處理的 OpenCV
-
用於檔案 I/O 和資料分析的 Pandas
PyTorch 並沒有重新創造 wheel,而是與 Numpy 很好地互動,以利用它現有的工具和庫生態系統。
可以用 torch.fron_numpy 將 Numpy 陣列轉化為 PyTorch 張量。
接下來可以驗證 Numpy 陣列和 PyTorch 張量是否擁有類似的資料型別。
可以使用張量的.to_numpy 方法將 PyTorch 張量轉化為 Numpy 陣列。
PyTorch 和 Numpy 之間的互操作性真的非常重要,因為你要用的大部分資料集都可能被讀取並預處理為 Numpy 陣列。
提交及上傳 notebook
最後一步是儲存並利用 jovian 庫提交以上工作
Jovian 將 notebook 上傳到 https://jvn.io (https://jvn.io/),用以上方式為你的 notebook 捕獲 Python 環境並建立可共享的連結。你可以利用這一連結分享自己的作品,讓任何人都可以利用 jovian clone 命令輕鬆復現。Jovian 還擁有一個強大的評論介面,供你和其他人討論及評論你 notebook 中的某個部分:
延伸閱讀
PyTorch 中的張量支援很多運算,這裡列出的並不詳盡。如果你想了解更多關於張量和張量運算的資訊,可參考以下地址:
連結:https://pytorch.org/docs/stable/tensors.html
如果你想利用互動式 Jupyter 環境的優勢來進行張量實驗並嘗試上述的各種不同運算組合,可以嘗試下面這些:
-
如果上面提到的例子中,一個或多個「x」、「w」或「b」是矩陣,而不是數字,該怎麼辦?在這種情況下,結果「y」、梯度 w.grad 和 b.grad 看起來將是怎樣的?
-
如果「y」是用 torch.tensor 建立的矩陣,矩陣的每個元素都表示為數字張量「x」、「w」和「b」的組合,該怎麼辦?
-
如果我們有一個運算鏈,而不止一個運算,即 y = x * w + b, z = l * y + m, e =c * z + d,該怎麼辦?呼叫 e.backward() 會發生什麼?
如果你對此感興趣,且想了解更多關於矩陣導數的資訊,可以參考:
連結:https://en.wikipedia.org/wiki/Matrix_calculus#Derivatives_with_matrices
以上,我們完成了關於 PyTorch 中張量和梯度的討論,下一步的主題將是線性迴歸。
該系列文章主要受到下面兩篇文章的啟發:
-
Yunjey Choi,PyTorch Tutorial for Deep Learning Researchers
-
地址:https://github.com/yunjey/pytorch-tutorial
-
Jeremy Howard,FastAI development notebooks
-
地址:https://github.com/fastai/fastai_docs/tree/master/dev_nb