Last Updated on 2021-03-28 by Clay
今天打算來介紹一下『PyTorch』—— 一個現在炙手可熱的 Python Machine Learning 框架,一邊學習、一邊把學習的心得記錄下來。
雖然看過目前的統計,現在使用 Tensorflow 的開發者還是佔了絕大部分(不知道統計的時候有沒有把 Keras 包進去呢?),但是光看 Github 上 PyTorch 的星數在短時間內迅速成長,就足以證明 PyTorch 確實有其好用的地方,更重要的是現在社群肯定是非常活躍的。
就在前不久前,大概幾個月前,PyTorch 終於推出了穩定 1.0 版本 (2020/03 更新時已經來到 1.4.0 版)。以此作為契機,我正式開始學習 PyTorch 了,也正如上面所述,作為學習,我打算在練習的過程中一併將心得筆記紀錄下來。
這樣的好處是在於將來我也可以重新翻閱我所寫過的心得筆記來複習,同時也能讓自己對於自己所寫下的程式碼理解更清楚,我覺得是相當不錯的紀錄。
前言講得太久了,以下開始正式的介紹吧!
PyTorch 是什麼呢?
PyTorch 是一個由 Python 撰寫的深度學習框架。
據我所查到的資料,這套工具最早是由 Facebook 基於 Torch 這個由 Lua 所寫成的機器學習框架改進而來,漸漸地變得方便、易學,甚至受到許多高手的加持,越來越多的套件被開發......總之,在各方面因緣際會之下,我終於開始進行 PyTorch 的學習啦。
為了這一天可是期待很久啊,前面真的太忙了!
不知道我會不會寫一套 PyTorch 的 Cuda、Cudnn 安裝教學..... 不過話說回來,我也是基於網路上的各位高手所寫的教學文進行攻略的,所以,我相信各位按照網路的安裝教學肯定能把環境安頓好的。 (2020/03 更新: 其實我後來終於還是寫了一篇 GPU 的安裝指南,也許大家可以參考看看:在 Ubuntu 18.04 上安裝 CUDA、CuDNN)
當然,如果只需要 CPU 的話是非常簡單的,只要直接上官網查看安裝指令就好。不過,就是聽說 Windows 麻煩了點。
我寫這篇文章的時候,主要是將 PyTorch 的 Tutorial 上的程式跑過了一遍,也許你也可以直接參考:
https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html
以下,正文開始。
Tensor
PyTorch 比著名的 Keras 來得更能客製化自己的 Model Layer (模型層),但與此同時,卻又沒有 Keras 的底層 Tensorflow 來得那般複雜難懂。(補充:我目前沒用過 tensorflow 2.0,聽說已經相當地親民了?)
Tensor,常被翻譯為『張量』,是我們可以在 PyTorch 上最一開始便能設定的資料型態。
Tensor 可以被任意串接,也可以輕鬆地在 Numpy 格式與 PyTorch Tensor 格式之間轉換——最重要的是,它支援 CUDA 的 GPU 加速,讓我們能夠使用 GPU 進行深度學習 —— 至少最後這點才是我學習 PyTorch 的主要目的!
from __future__ import print_function import torch
首先第一步,自然是 import torch 啦!(首先必須安裝 torch。)
以下便是 PyTorch Tutorial 的第一個 Sample Code:
以下便是 PyTorch Tutorial 的第一個 Sample Code:
x = torch.empty(5, 3) print(x)
這是最基本的,一個未初始化的 5x3 矩陣:
tensor([[2.6165e+11, 4.5695e-41, 2.6165e+11],
[4.5695e-41, 2.0283e-19, 2.8825e+32],
[2.7262e+20, 1.2119e+25, 2.0283e-19],
[2.7909e+23, 1.5986e+34, 1.1626e+27],
[8.9666e-33, 1.3563e-19, 1.8578e-01]])
我們也可以像是給予 Random Value 一邊給矩陣賦予值,只需要事先設定好矩陣的維度:
x = torch.rand(5, 3) print(x)
我們輸出如下:
tensor([[0.4819, 0.2061, 0.8834],
[0.7812, 0.4246, 0.5375],
[0.8140, 0.2164, 0.5493],
[0.2412, 0.3382, 0.7903],
[0.3368, 0.5848, 0.8287]])
是不是很方便呢?
我們再來看一個給予初始化矩陣的例子,這次是給予全部矩陣值為 0:
x = torch.zeros(5, 3) print(x)
同樣,我們先設定好矩陣維度,然後我們執行程式:
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
除了以上初始化矩陣的方法外,其實我們也可以直接設定矩陣值:
x = torch.tensor([[1, 1], [2, 2]]) print(x)
我設定了一個二維矩陣,看看 PyTorch 是不是真的會如我希望的印出呢?
tensor([[1, 1],
[2, 2]])
矩陣運算
以下簡單地來介紹 Tensor 這種資料格式該怎麼運算吧!在 PyTorch 裡頭可以非常簡單直覺地操作:
x = torch.rand(2, 2) y = torch.rand(2, 2) print('x:', x) print('y:', y) print('x+y:', x+y) print('x-y:', x-y)
output:
x: tensor([[0.0138, 0.7394],
[0.0525, 0.8128]])
y: tensor([[0.3438, 0.9111],
[0.9264, 0.3652]])
x+y: tensor([[0.3576, 1.6505],
[0.9789, 1.1780]])
x-y: tensor([[-0.3300, -0.1718],
[-0.8739, 0.4476]])
是不是真的很直覺呢?
Numpy
PyTorch 的 Tensor 非常地方便好用,相信也不用多提了。那麼 Python 中最富盛名的矩陣處理資料套件,想必恐怕非 Numpy 莫屬了。
以下我便來介紹該如何轉換 PyTorch 的 Tensor 及 Numpy。
從 Tensor 轉換到 Numpy 以及 從 Numpy 轉換到 Tensor:
import numpy as np # Convert Tensor to Numpy x = torch.ones(5) y = x.numpy() print(x) print(y) # Convert Numpy to Tensor a = np.ones(5) b = torch.from_numpy(a) print(a) print(b)
看看我們輸出的結果:
tensor([1., 1., 1., 1., 1.])
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
格式是不是分別為:
Tensor
Numpy
Numpy
Tensor
這樣呢?
CUDA
最令人興奮的時刻!該怎麼使用 PyTorch 使用 GPU 來進行深度學習呢?
首先你要先記住這樣一個指令:
torch.cuda.is_available()
這個指令可以確認你的電腦上到底有沒有可以拿來進行深度學習的 GPU。
為了讓我們程式不要隨便報錯,我們可以在準備執行深度學習的程式馬上方先執行 if 條件判斷式來確認我們電腦是否真的有顆足以調用的 GPU:
if torch.cuda.is_available(): device = torch.device('cuda') x = torch.rand(2, 2) y = torch.ones_like(x, device=device) x = x.to(device) z = x + y print(z) print(z.to('cpu', torch.double))
下方的程式只是很單純地印出用 CUDA 產生的 z、以及之後我們使用指令轉回 CPU 儲存的 z:
tensor([[1.2155, 1.5125],
[1.7806, 1.4735]], device='cuda:0')
tensor([[1.2155, 1.5125],
[1.7806, 1.4735]], dtype=torch.float64)
我們可以看到兩邊後面的 device 並不相同,這代表我們前面真的有用 GPU 加速產生了一個資料,緊接著才是我們把它還原回去!
如果還想知道更多關於使用 GPU 的 PyTorch 與不使用的,也許你可以參考看看這個網站:
https://pytorch.org/docs/stable/tensors.html
這裡詳細地列出了許多不同的指令,查閱這個再方便不過了!
後記
以上就是我今日紀錄 PyTorch 的筆記,希望能早日進展到後頭。
=== 2020/03 === 更新
目前已經使用過 PyTorch 訓練了各式各樣的模型了,其中我寫過最複雜的甚至肯定 CycleGAN。光是看懂、慢慢刻出程式碼、解 Bug ...... 就花掉了我足足兩個禮拜的時間。然後訓練模型又再花了我一個禮拜的時間,還因為前處理的資料有點小缺陷沒有過濾掉導致 Style Transfer 效果不盡如人意, Nooooooooooo。
不過現在回來看到這篇剛開始學習 PyTorch 時的心得,總覺得一切都值得了。 PyTorch 真的寫起來很棒、很直覺、能很清楚自己現在在做什麼。
我以後還是會繼續使用 PyTorch 來撰寫深度學習的模型的。推薦給所有想要學習深度學習的人。