影像分類資料集(Fashion-MNIST)
- 影像分類資料集(Fashion-MNIST)
- 獲取資料集
- 讀取小批量
- 小結
- 參考文獻
- 資料集下載
影像分類資料集(Fashion-MNIST)
在介紹softmax回歸的實作前我們先引入一個多類影像分類資料集,
它將在后面的章節中被多次使用,以方便我們觀察比較演算法之間在模型精度和計算效率上的區別,影像分類資料集中最常用的是手寫數字識別資料集MNIST[1],但大部分模型在MNIST上的分類精度都超過了95%,
為了更直觀地觀察演算法之間的差異,我們將使用一個影像內容更加復雜的資料集Fashion-MNIST[2](這個資料集也比較小,只有幾十M,沒有GPU的電腦也能吃得消),
本節我們將使用torchvision包,它是服務于PyTorch深度學習框架的,主要用來構建計算機視覺模型,torchvision主要由以下幾部分構成:
torchvision.datasets: 一些加載資料的函式及常用的資料集介面;torchvision.models: 包含常用的模型結構(含預訓練模型),例如AlexNet、VGG、ResNet等;torchvision.transforms: 常用的圖片變換,例如裁剪、旋轉等;torchvision.utils: 其他的一些有用的方法,
獲取資料集
首先匯入本節需要的包或模塊,
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import time
import sys
sys.path.append("..") # 為了匯入上層目錄的d2lzh_pytorch
import d2lzh_pytorch as d2l
下面,我們通過torchvision的torchvision.datasets來下載這個資料集,第一次呼叫時會自動從網上獲取資料,我們通過引數train來指定獲取訓練資料集或測驗資料集(testing data set),測驗資料集也叫測驗集(testing set),只用來評價模型的表現,并不用來訓練模型,
另外我們還指定了引數transform = transforms.ToTensor()使所有資料轉換為Tensor,如果不進行轉換則回傳的是PIL圖片,transforms.ToTensor()將尺寸為 (H x W x C) 且資料位于[0, 255]的PIL圖片或者資料型別為np.uint8的NumPy陣列轉換為尺寸為(C x H x W)且資料型別為torch.float32且位于[0.0, 1.0]的Tensor,
注意: 由于像素值為0到255的整數,所以剛好是uint8所能表示的范圍,包括
transforms.ToTensor()在內的一些關于圖片的函式就默認輸入的是uint8型,若不是,可能不會報錯但可能得不到想要的結果,所以,如果用像素值(0-255整數)表示圖片資料,那么一律將其型別設定成uint8,避免不必要的bug, 本人就被這點坑過,詳見我的這個博客2.2.4節,
mnist_train = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST', train=True, download=True, transform=transforms.ToTensor())
mnist_test = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST', train=False, download=True, transform=transforms.ToTensor())
上面的mnist_train和mnist_test都是torch.utils.data.Dataset的子類,所以我們可以用len()來獲取該資料集的大小,還可以用下標來獲取具體的一個樣本,訓練集中和測驗集中的每個類別的影像數分別為6,000和1,000,因為有10個類別,所以訓練集和測驗集的樣本數分別為60,000和10,000,
print(type(mnist_train))
print(len(mnist_train), len(mnist_test))
輸出:
<class 'torchvision.datasets.mnist.FashionMNIST'>
60000 10000
我們可以通過下標來訪問任意一個樣本:
feature, label = mnist_train[0]
print(feature.shape, label) # Channel x Height x Width
輸出:
torch.Size([1, 28, 28]) tensor(9)
變數feature對應高和寬均為28像素的影像,由于我們使用了transforms.ToTensor(),所以每個像素的數值為[0.0, 1.0]的32位浮點數,需要注意的是,feature的尺寸是 (C x H x W) 的,而不是 (H x W x C),第一維是通道數,因為資料集中是灰度影像,所以通道數為1,后面兩維分別是影像的高和寬,
Fashion-MNIST中一共包括了10個類別,分別為t-shirt(T恤)、trouser(褲子)、pullover(套衫)、dress(連衣裙)、coat(外套)、sandal(涼鞋)、shirt(襯衫)、sneaker(運動鞋)、bag(包)和ankle boot(短靴),以下函式可以將數值標簽轉成相應的文本標簽,
# 本函式已保存在d2lzh包中方便以后使用
def get_fashion_mnist_labels(labels):
text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat',
'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
return [text_labels[int(i)] for i in labels]
下面定義一個可以在一行里畫出多張影像和對應標簽的函式,
# 本函式已保存在d2lzh包中方便以后使用
def show_fashion_mnist(images, labels):
d2l.use_svg_display()
# 這里的_表示我們忽略(不使用)的變數
_, figs = plt.subplots(1, len(images), figsize=(12, 12))
for f, img, lbl in zip(figs, images, labels):
f.imshow(img.view((28, 28)).numpy())
f.set_title(lbl)
f.axes.get_xaxis().set_visible(False)
f.axes.get_yaxis().set_visible(False)
plt.show()
現在,我們看一下訓練資料集中前10個樣本的影像內容和文本標簽,
X, y = [], []
for i in range(10):
X.append(mnist_train[i][0])
y.append(mnist_train[i][1])
show_fashion_mnist(X, get_fashion_mnist_labels(y))

讀取小批量
我們將在訓練資料集上訓練模型,并將訓練好的模型在測驗資料集上評價模型的表現,前面說過,mnist_train是torch.utils.data.Dataset的子類,所以我們可以將其傳入torch.utils.data.DataLoader來創建一個讀取小批量資料樣本的DataLoader實體,
在實踐中,資料讀取經常是訓練的性能瓶頸,特別當模型較簡單或者計算硬體性能較高時,PyTorch的DataLoader中一個很方便的功能是允許使用多行程來加速資料讀取,這里我們通過引數num_workers來設定4個行程讀取資料,
batch_size = 256
if sys.platform.startswith('win'):
num_workers = 0 # 0表示不用額外的行程來加速讀取資料
else:
num_workers = 4
train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=num_workers)
test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=num_workers)
我們將獲取并讀取Fashion-MNIST資料集的邏輯封裝在d2lzh_pytorch.load_data_fashion_mnist函式中供后面章節呼叫,該函式將回傳train_iter和test_iter兩個變數,隨著本書內容的不斷深入,我們會進一步改進該函式,它的完整實作將在5.6節中描述,
最后我們查看讀取一遍訓練資料需要的時間,
start = time.time()
for X, y in train_iter:
continue
print('%.2f sec' % (time.time() - start))
輸出:
1.57 sec
小結
- Fashion-MNIST是一個10類服飾分類資料集,之后章節里將使用它來檢驗不同演算法的表現,
- 我們將高和寬分別為
h
h
h和
w
w
w像素的影像的形狀記為
h
×
w
h \times w
h×w或
(h,w),
參考文獻
[1] LeCun, Y., Cortes, C., & Burges, C. http://yann.lecun.com/exdb/mnist/
[2] Xiao, H., Rasul, K., & Vollgraf, R. (2017). Fashion-mnist: a novel image dataset for benchmarking machine learning algorithms. arXiv preprint arXiv:1708.07747.
注:本節除了代碼之外與原書基本相同,原書傳送門
資料集下載
請參考:Link
相關問題:URL fetch failure on https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz: None
【Tensorflow實作多層神經網路】tf.keras進行fashion_mnist時裝分類(完整版)
本人出于學習的目的,參考本書內容,非商業用途,推薦大家閱讀此書,一起學習!!!
加油!
感謝!
努力!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/348544.html
標籤:AI
上一篇:李沐《動手學深度學習v2》學習筆記(二):線性回歸和實作
下一篇:機器學習之路14
