目錄
- 3.5. 圖像分類數據集
- 1)讀取數據集
- 2)讀取小批量
- 3)整合所有組件
- 4)小結
.
3.5. 圖像分類數據集
我們將使用Fashion-MNIST數據集,作為圖像分類數據集。
%matplotlib inline
import torch
import torchvision
from torch.utils import data
from torchvision import transforms
from d2l import torch as d2ld2l.use_svg_display()
.
1)讀取數據集
可以通過框架中的內置函數將Fashion-MNIST數據集下載并讀取到內存中。
# 通過ToTensor實例將圖像數據從PIL類型變換成32位浮點數格式,
# 并除以255使得所有像素的數值均在0~1之間
trans = transforms.ToTensor()
mnist_train = torchvision.datasets.FashionMNIST(root="../data", train=True, transform=trans, download=True)
mnist_test = torchvision.datasets.FashionMNIST(root="../data", train=False, transform=trans, download=True)
Fashion-MNIST由10個類別的圖像組成, 每個類別由訓練數據集(train dataset)中的6000張圖像 和測試數據集(test dataset)中的1000張圖像組成。
# 數據集大小
len(mnist_train), len(mnist_test)
# 輸出:(60000, 10000)# 數據集圖像尺寸
mnist_train[0][0].shape
# 輸出:torch.Size([1, 28, 28])# 數據集類別
def get_fashion_mnist_labels(labels): #@save"""返回Fashion-MNIST數據集的文本標簽"""text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat','sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']return [text_labels[int(i)] for i in labels]
現在可以創建一個函數來可視化這些樣本。
def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5): #@save"""繪制圖像列表"""figsize = (num_cols * scale, num_rows * scale)_, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize)axes = axes.flatten()for i, (ax, img) in enumerate(zip(axes, imgs)):if torch.is_tensor(img):# 圖片張量ax.imshow(img.numpy())else:# PIL圖片ax.imshow(img)ax.axes.get_xaxis().set_visible(False)ax.axes.get_yaxis().set_visible(False)if titles:ax.set_title(titles[i])return axesX, y = next(iter(data.DataLoader(mnist_train, batch_size=18)))
show_images(X.reshape(18, 28, 28), 2, 9, titles=get_fashion_mnist_labels(y));
.
2)讀取小批量
通過內置數據迭代器,我們可以隨機打亂了所有樣本,從而無偏見地讀取小批量。
batch_size = 256def get_dataloader_workers(): #@save"""使用4個進程來讀取數據"""return 4train_iter = data.DataLoader(mnist_train, batch_size, shuffle=True,num_workers=get_dataloader_workers())
讀取訓練數據所需的時間。
timer = d2l.Timer()
for X, y in train_iter:continue
f'{timer.stop():.2f} sec'# 輸出:'3.37 sec'
.
3)整合所有組件
定義load_data_fashion_mnist
函數,獲取Fashion-MNIST數據集,返回訓練集和驗證集的數據迭代器。 函數接受可選參數resize
,用來將圖像大小調整為另一種形狀。
def load_data_fashion_mnist(batch_size, resize=None): #@save"""下載Fashion-MNIST數據集,然后將其加載到內存中"""trans = [transforms.ToTensor()]if resize:trans.insert(0, transforms.Resize(resize))trans = transforms.Compose(trans)mnist_train = torchvision.datasets.FashionMNIST(root="../data", train=True, transform=trans, download=True)mnist_test = torchvision.datasets.FashionMNIST(root="../data", train=False, transform=trans, download=True)return (data.DataLoader(mnist_train, batch_size, shuffle=True,num_workers=get_dataloader_workers()),data.DataLoader(mnist_test, batch_size, shuffle=False,num_workers=get_dataloader_workers()))
下面,通過指定resize
參數來測試load_data_fashion_mnist
函數的圖像大小調整功能。
train_iter, test_iter = load_data_fashion_mnist(32, resize=64)
for X, y in train_iter:print(X.shape, X.dtype, y.shape, y.dtype)break# 輸出:
torch.Size([32, 1, 64, 64]) torch.float32 torch.Size([32]) torch.int64
現在已經準備好使用Fashion-MNIST數據集,便于下面的章節調用來評估各種分類算法。
.
4)小結
-
Fashion-MNIST是一個服裝分類數據集,由10個類別的圖像組成。我們將在后續章節中使用此數據集來評估各種分類算法。
-
我們將高度像素,寬度像素圖像的形狀記為或(,)。
-
數據迭代器是獲得更高性能的關鍵組件。依靠實現良好的數據迭代器,利用高性能計算來避免減慢訓練過程。
.
聲明:資源可能存在第三方來源,若有侵權請聯系刪除!