當前位置:
首頁 > 新聞 > PyTorch進階之路(一):張量與梯度

PyTorch進階之路(一):張量與梯度

PyTorch 是 Facebook 開發和維護的一個開源的神經網路庫,近來的發展勢頭相當強勁,也有越來越多的開發者為其撰寫教程,本文也是其中之一。這是「PyTorch: Zero to GANs」系列教程的第一篇,介紹了 PyTorch 模型的基本構件:張量和梯度。

完整系列教程包括:

  1. PyTorch 基礎:張量&梯度(本文)
  2. 線性回歸 & 梯度下降:https://medium.com/jovian-io/linear-regression-with-pytorch-3dde91d60b50
  3. 用 Logistic 回歸進行分類:https://medium.com/jovian-io/image-classification-using-logistic-regression-in-pytorch-ebb96cc9eb79
  4. 未完待續.. (神經網路、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.ipynb environment.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 界面。

PyTorch進階之路(一):張量與梯度

然後,你可以點擊 01-pytorch-basics.ipynb 文件夾,打開它然後運行代碼。如果想自己輸入代碼,你還可以通過點擊「New」鍵來創建新的 notebook。

首先導入 PyTorch:

PyTorch進階之路(一):張量與梯度


張量

本質上來說,PyTorch 是一個處理張量的庫。一個張量是一個數字、向量、矩陣或任何 n 維數組。我們用單個數字創建一個張量:

PyTorch進階之路(一):張量與梯度

4. 是 4.0 的縮寫。它用來表示你想創建浮點數的 Python(和 PyTorch)。我們可以通過檢查張量的 dtype 屬性來驗證這一點:

PyTorch進階之路(一):張量與梯度

我們可以試著創建複雜一點的張量:

PyTorch進階之路(一):張量與梯度

張量可以有任何維數。每個維度有不同的長度。我們可以用張量的.shape 屬性來查看每個維度的長度。

PyTorch進階之路(一):張量與梯度


張量運算和梯度

我們可以將張量與常用的算數運算相結合。如下:

PyTorch進階之路(一):張量與梯度

我們已經創建了 3 個張量:x、w 和 b。w 和 b 有額外的參數 requires_grad,設置為 True。一會兒就可以看看它能做什麼。

通過結合這些張量,我們可以創建新的張量 y。

PyTorch進階之路(一):張量與梯度

如預期所料,y 是值為 3 * 4 + 5 = 17 的張量。PyTorch 的特殊之處在於,我們可以自動計算 y 相對於張量(requires_grad 設置為 True)的導數,即 w 和 b。為了計算導數,我們可以在結果 y 上調用.backward 方法。

PyTorch進階之路(一):張量與梯度

y 相對於輸入張量的導數被存儲在對相應張量的.grad 屬性中。

PyTorch進階之路(一):張量與梯度

如預期所料,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 很好地交互,以利用它現有的工具和庫生態系統。

PyTorch進階之路(一):張量與梯度

可以用 torch.fron_numpy 將 Numpy 數組轉化為 PyTorch 張量。

PyTorch進階之路(一):張量與梯度

接下來可以驗證 Numpy 數組和 PyTorch 張量是否擁有類似的數據類型。

PyTorch進階之路(一):張量與梯度

可以使用張量的.to_numpy 方法將 PyTorch 張量轉化為 Numpy 數組。

PyTorch進階之路(一):張量與梯度

PyTorch 和 Numpy 之間的互操作性真的非常重要,因為你要用的大部分數據集都可能被讀取並預處理為 Numpy 數組。


提交及上傳 notebook

最後一步是保存並利用 jovian 庫提交以上工作

PyTorch進階之路(一):張量與梯度

Jovian 將 notebook 上傳到 https://jvn.io (https://jvn.io/),用以上方式為你的 notebook 捕獲 Python 環境並創建可共享的鏈接。你可以利用這一鏈接分享自己的作品,讓任何人都可以利用 jovian clone 命令輕鬆復現。Jovian 還擁有一個強大的評論界面,供你和其他人討論及評論你 notebook 中的某個部分:

PyTorch進階之路(一):張量與梯度

延伸閱讀

PyTorch 中的張量支持很多運算,這裡列出的並不詳盡。如果你想了解更多關於張量和張量運算的信息,可參考以下地址:

鏈接:https://pytorch.org/docs/stable/tensors.html

如果你想利用互動式 Jupyter 環境的優勢來進行張量實驗並嘗試上述的各種不同運算組合,可以嘗試下面這些:

  1. 如果上面提到的例子中,一個或多個「x」、「w」或「b」是矩陣,而不是數字,該怎麼辦?在這種情況下,結果「y」、梯度 w.grad 和 b.grad 看起來將是怎樣的?
  2. 如果「y」是用 torch.tensor 創建的矩陣,矩陣的每個元素都表示為數字張量「x」、「w」和「b」的組合,該怎麼辦?
  3. 如果我們有一個運算鏈,而不止一個運算,即 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

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

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


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

神還原女神照片!GAN為百年舊照上色
李沐等將目標檢測絕對精度提升 5%,不犧牲推理速度

TAG:機器之心 |