再想要快速測試一個想法時,固然我們已經有 Pytorch 可以幫我們快速一層一層地搭建一個可以跑得模型,但這個仍然不是一個非常快速的選擇,若是我們今天想要使用一個有 152 層的 ResNet152 的話,傻傻的一層一層打不是要很久QQ 我們未來其實會去介紹如何使用一些技巧去寫這樣的結構,但目前的我們還沒有這樣的能力。
另外舉個實際例子,若我們要訓練一個蠻深的深度學習網路像是 Resnet-152 , dataset 用 ImageNet 來 Training, 想要 train 到像是 paper 或者網路上宣稱的準度,如果你試用一般家用主機上的 GPU train 的話,你怕是把顯卡燒了或者 AMD 都 Yes 了一段時間都還 Train 不完QQ
那難道要這樣直接開始打嗎?在此請冷靜,我們可以快速地使用一個很有用的官方 Library Torchvision 去使用一些常見的 Model,甚至,一些常見的 Dataset 或者 Data Argumentation 的方法都可以配我們這樣快速使用喔!!
Torchvision 是一個 Pytorch 官方維護的資源庫,裡面主要收錄三大類資源:
pip install torchvision
一些document跟各別function或者提供的內容可見官網
好啦我知道你們碗真的要敲破了XDDD難得的來寫一下基本的使用情況吧。我分成4步來示範一下使用 Torchvision 大概會長啥樣:
在安裝完或者已經有現成的環境中,我這邊以開啟 Colab 做示範, 使用下方程式碼來引入 Pytorch 跟 Torchvision :
import torch
import torchvision
接下來按下執行沒有報錯基本上就是有成功引入,當然我們也可以藉由查詢版本的方式再一次確認真的有抓到:
torch.__version__
torchvision.__version__
執行完的結果如下:
在 Torchvision 上有非常多的Dataset可以使用詳可見官網連結,那我們今天舉個最簡單的例子"Cifar 10"來給大家看看,這是一個小小的dataset,每張照片為32 X 32 RGB照片並且有相對應的 Label,我們以官網的tutorial來說明:
0. Import 必須資料庫
import torch
import torchvision
import torchvision.transforms as transforms
1.使用下面指令可以下載Cifar 10 的Training dataset 以及 Testing dataset
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
畫面會長成這樣:
2.使用 Dataloder 讀進這些 dataset 並加上 label
Dataloder是用來讀這些dataset的工具,目前我們先使用 pytorch 本身的dataloder即可,我們若有空會在實務篇講解一下dataloder內部細節以及如何自訂義 dataloder來讀自己的dataset
預先打 transform 的形式,這個用來把dataset做轉換,這邊只是先轉換成 Tensor 的型態
transform = transforms.Compose(
[transforms.ToTensor()])
先打 Tarining 跟 Testing dataset 的 dataloder
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)
接者加入label 種類
classes = ('plane', 'car', 'bird', 'cat',
'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
3.我們讓dataset 顯示
使用 matplot 來顯示:
import matplotlib.pyplot as plt
import numpy as np
# functions to show an image
def imshow(img):
img = img / 2 + 0.5 # unnormalize
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
plt.show()
# get some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()
# show images
imshow(torchvision.utils.make_grid(images))
print(' '.join('%5s' % classes[labels[j]] for j in range(4)))
並可以得到以下結果:
如上節所看到的,我們可以藉由設置 "transform" 來設定我們想對 dataset做甚麼多的處理
例如:
transform = transforms.Compose(
[transforms.ToTensor(),
transform.Translation(),
transforms.RandomHorizontalFlip(p=0.5)
])
我們可以得到類似以下效果:
這個我們下一章會再講,但現在可以先給大家看看效果:
1.導入 torchvision 中的 models
import torchvision.models as models
2.雕選自己想要的 Pretrain model,這裡以 Renet 18 當例子:
resnet18 = models.resnet18(pretrained = True)
3.印出來看看是否成功導入model
print(resnet18)
沒錯的話應該會長以下畫面:
Torchvision 是一個十分好用且資源豐富的資源庫,日後可以各種多方嘗試看看各個功能!!