pytorch 基本操作

Qi Fong
5 min readJul 2, 2021

本文介紹pytorch框架的基本操作,包含有

  1. pytorch安裝
  2. Dataset
  3. DataLoader
  4. Model建立
  5. Model training
  6. validation

一、pytorch 安裝

此節操作假設已經安裝完Anaconda。

首先,先創建一個新的環境(如果想安裝在舊的環境也可以),再命令提示字元或終端機下輸入:

conda create -n env_name python=3.8

上面的env_name可以換成你想要取的環境名稱

接著,進入剛建立的環境,在終端機輸入

conda activate env_name

最後去pytorch官網按照自己的需求點選版本,把指令複製下來,在終端機輸入,如果是要安裝GPU版本,就要額外先安裝好cuda, cudnn,此篇暫不介紹

conda install pytorch torchvision torchaudio cpuonly -c pytorch

如此就完成了pytorch 的安裝。

二、Dataset

pytorch是一個深度網路的訓練框架,所以或多或少一定會有資料集合,而且多少會需要對資料做一些操作,比方說設定batch,這些操作在pytorch提供的模組DataLoader下,有很自動化方便的操作,但他只接受pytorch的Dataset,所以要先建立好Dataset,再將他送入DataLoader。

自定義的Dataset,必定要有三個方法在內,基本格式很固定,如下:

import torch
import torch.nn as nn
import torchvision
from torchvision import transforms
from torch.utils.data import Dataset, DataLoader
class CustomDataset(Dataset):#繼承Dataset
def __init__(self, data, label):
# 假設data是一個numpy array的格式,也可以是DataFrame
# 要對資料有所理解才知道這邊要放啥
self.data = data # feature
self.label = label # label
def __len__(self):
return len(self.data)

def __getitem__(self, index):
x_data = torch.FloatTensor(self.data[index])
y_label = torch.FloatTensor(self.label[index])
return (x_data, y_label)

以上__init__(), __len()__, __getitem__()是必要的,名稱不能改。

建立好類別後就分別建立訓練和測試的dataset

train_dataset = CustomDataset(train_data,train_label)
test_dataset = CustomDataset(test_data, test_label)

remark: CustomDataset這個名稱可以按照識別度自己取

三、DataLoader

這一步就簡單很多了,定義好batch_size和shuffle(預設True)與否,就結束了

batch_size = 256
train_loader = DataLoader(train_dataset,batch_size=batch_size)
test_loader = DataLoader(test_dataset,batch_size=batch_size)

四、Model建立

深度學習的模型建立,以下為範例,__init__(), super(), forward()這三個都是必要的。

五、Model training

定義好epochs, optimizer, loss function後,以for迴圈不斷的重複訓練即可

以上的

optimizer.zero_grad()

loss = loss_function(out, labels)

loss.backward()

optimizer.step()

這四步是更新model權重的固定流程

如果想要紀錄每個epoch執行完的loss,可以建立一個loss_hist的陣列,然後一個epoch結束後,用loss.item()方法回傳loss大小

六、validation

當model訓練完後,你一定會想要看看在testing set上的表現如何,固定格式如下:

主要是with torch.no_grad()

因為是要看表現,所以不計算梯度

而model.evale()是如果model中有dropout或batch normalization的操作,在測試上,通常會取消掉這個機制。

model.train()是因為測試完了,如果之後還有要繼續train model,那就要再把dropout這些機制重新開啟來。

總結

  1. 以上二~六的步驟,就是使用pytorch做機器學習或深度學習時的基本操作。
  2. 其中花最多心力的應該是CustomDataset的建立。
  3. 不同的model可能會要求不同的input,那與之對應的CustomDataset也會有所不同,不同資料型態的處理或特徵的預處理,都要在這邊做新增或修改。
  4. Model的建立要根據問題去挑選和建構。

--

--