從實例逐步了解基本 PyTorch 如何運作

Source: Deep Learning on Medium

PyTorch

接下來終於要進入 PyTorch 了!不過在用 PyTorch 建立模型前,我們要先有一些 PyTorch 中的基本概念。像是 tensor 是什麼,如何建立參數和該存放在哪裡等。

Tensor

在機器學習領域中,我們可以把張量 (Tensor) 想像成一種有多個維度的數據容器,在物理和數學中,tensor 的定義又更嚴謹些。首先我們先看這個表:

從表中可以看到,rank0 的 tensor 是純量 (scalar),1 是 vector,2 是 matrix,包含 3 以上則是 tensor,像是圖像、時間、影像都是要用 ≥ 3 維的方式,也就是 rank 3 的 tensor 來儲存。

透過實際的例子我們比較好了解究竟是怎麼回事:

來源

讀取資料和裝置

PyTorch 有一個很方便的功能就是,能夠直接將 numpy array 轉為 PyTorch tensor。不過呢,轉換過來的 tensor 會存放在 cpu 上面,但是我們都知道嘛,用 gpu 訓練模型比用 cpu 快得多,所以我們就要把 tensor 轉到 gpu 上面。

接下來就用實例看看如何做到上述的操作,首先看看我們的電腦能不能使用CUDA (Nvidia牌的)

import torch
device = 'cuda' if torch.cuda.is_available() else 'cpu'

將我們先前用 numpy 建立了資料轉成 tensor

x_train_tensor = torch.from_numpy(x_train).to(device)
y_train_tensor = torch.from_numpy(y_train).to(device)

看一下各自的型別

print(type(x_train), type(x_train_tensor), x_train_tensor.type())

檢查 tensor 存放在哪

x_train_tensor.type()

會得到 torch.cuda.DoubleTensor, 沒 gpu 則是 torch.DoubleTensor。

當然我們也可以把 tensor 轉回去 numpy array,不過假如我們的 tensor 是在 gpu 上,我們需要先把他轉存到 cpu。

x_train_tensor.cpu().numpy()

建立參數

剛剛我們只是單純建立一個資料,那要怎麼樣讓這個資料可以用來訓練呢?還記得我們在前面提到的梯度吧?沒錯!在 tensor 我們同樣要計算他的梯度,好消息是我們可以叫 PyTorch 幫我們做!只要在建立資料時,用 requires_grad=True 就可以了。

a = torch.randn(1, requires_grad=True)
b = torch.randn(1, requires_grad=True)

若是要在 gpu 做運算的話,則需要先傳到 gpu 上後在使用 requires_grad

a = torch.randn(1).to(device)
b = torch.randn(1).to(device)
a.requires_grad_()
b.requires_grad_()

注意 requires_grad 後面的底線「 _ 」,在 PyTorch 中,用「 _ 」結尾的方法都會改變變數本身。

最後我們也可以直接在建立參數時,直接指定 device argument。

torch.manual_seed(7)
a = torch.randn(1, requires_grad=True, device=device)
b = torch.randn(1, requires_grad=True, device=device)