[動手學深度學習-PyTorch版]-3.5深度學習基礎-圖像分類數(shù)據(jù)集(Fashion-MINIST)

3.5 圖像分類數(shù)據(jù)集(Fashion-MNIST)

在介紹softmax回歸的實現(xiàn)前我們先引入一個多類圖像分類數(shù)據(jù)集或详。它將在后面的章節(jié)中被多次使用,以方便我們觀察比較算法之間在模型精度和計算效率上的區(qū)別。圖像分類數(shù)據(jù)集中最常用的是手寫數(shù)字識別數(shù)據(jù)集MNIST[1]筛欢。但大部分模型在MNIST上的分類精度都超過了95%煌茴。為了更直觀地觀察算法之間的差異,我們將使用一個圖像內容更加復雜的數(shù)據(jù)集Fashion-MNIST[2](這個數(shù)據(jù)集也比較小,只有幾十M溉贿,沒有GPU的電腦也能吃得消)看疙。

本節(jié)我們將使用torchvision包豆拨,它是服務于PyTorch深度學習框架的,主要用來構建計算機視覺模型能庆。torchvision主要由以下幾部分構成:

  1. torchvision.datasets: 一些加載數(shù)據(jù)的函數(shù)及常用的數(shù)據(jù)集接口施禾;
  2. torchvision.models: 包含常用的模型結構(含預訓練模型),例如AlexNet搁胆、VGG弥搞、ResNet等;
  3. torchvision.transforms: 常用的圖片變換渠旁,例如裁剪拓巧、旋轉等;
  4. torchvision.utils: 其他的一些有用的方法一死。

3.5.1 獲取數(shù)據(jù)集

首先導入本節(jié)需要的包或模塊肛度。

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來下載這個數(shù)據(jù)集投慈。第一次調用時會自動從網上獲取數(shù)據(jù)承耿。我們通過參數(shù)train來指定獲取訓練數(shù)據(jù)集或測試數(shù)據(jù)集(testing data set)。測試數(shù)據(jù)集也叫測試集(testing set)伪煤,只用來評價模型的表現(xiàn)加袋,并不用來訓練模型。

另外我們還指定了參數(shù)transform = transforms.ToTensor()使所有數(shù)據(jù)轉換為Tensor抱既,如果不進行轉換則返回的是PIL圖片职烧。transforms.ToTensor()將尺寸為 (H x W x C) 且數(shù)據(jù)位于[0, 255]的PIL圖片或者數(shù)據(jù)類型為np.uint8的NumPy數(shù)組轉換為尺寸為(C x H x W)且數(shù)據(jù)類型為torch.float32且位于[0.0, 1.0]的Tensor

注意: 由于像素值為0到255的整數(shù)防泵,所以剛好是uint8所能表示的范圍蚀之,包括transforms.ToTensor()在內的一些關于圖片的函數(shù)就默認輸入的是uint8型,若不是捷泞,可能不會報錯但可能得不到想要的結果足删。所以,如果用像素值(0-255整數(shù))表示圖片數(shù)據(jù)锁右,那么一律將其類型設置成uint8失受,避免不必要的bug讶泰。 本人就被這點坑過,詳見我的這個博客2.2.4節(jié)拂到。

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_trainmnist_test都是torch.utils.data.Dataset的子類痪署,所以我們可以用len()來獲取該數(shù)據(jù)集的大小,還可以用下標來獲取具體的一個樣本兄旬。訓練集中和測試集中的每個類別的圖像數(shù)分別為6,000和1,000狼犯。因為有10個類別,所以訓練集和測試集的樣本數(shù)分別為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()劈狐,所以每個像素的數(shù)值為[0.0, 1.0]的32位浮點數(shù)罐孝。需要注意的是,feature的尺寸是 (C x H x W) 的肥缔,而不是 (H x W x C)莲兢。第一維是通道數(shù),因為數(shù)據(jù)集中是灰度圖像续膳,所以通道數(shù)為1改艇。后面兩維分別是圖像的高和寬。

Fashion-MNIST中一共包括了10個類別坟岔,分別為t-shirt(T恤)谒兄、trouser(褲子)、pullover(套衫)社付、dress(連衣裙)承疲、coat(外套)、sandal(涼鞋)鸥咖、shirt(襯衫)燕鸽、sneaker(運動鞋)、bag(包)和ankle boot(短靴)啼辣。以下函數(shù)可以將數(shù)值標簽轉成相應的文本標簽啊研。

# 本函數(shù)已保存在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]

下面定義一個可以在一行里畫出多張圖像和對應標簽的函數(shù)。

# 本函數(shù)已保存在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()

現(xiàn)在鸥拧,我們看一下訓練數(shù)據(jù)集中前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))
image

3.5.2 讀取小批量

我們將在訓練數(shù)據(jù)集上訓練模型,并將訓練好的模型在測試數(shù)據(jù)集上評價模型的表現(xiàn)富弦。前面說過麸锉,mnist_traintorch.utils.data.Dataset的子類,所以我們可以將其傳入torch.utils.data.DataLoader來創(chuàng)建一個讀取小批量數(shù)據(jù)樣本的DataLoader實例舆声。

在實踐中花沉,數(shù)據(jù)讀取經常是訓練的性能瓶頸柳爽,特別當模型較簡單或者計算硬件性能較高時。PyTorch的DataLoader中一個很方便的功能是允許使用多進程來加速數(shù)據(jù)讀取碱屁。這里我們通過參數(shù)num_workers來設置4個進程讀取數(shù)據(jù)磷脯。

batch_size = 256
if sys.platform.startswith('win'):
    num_workers = 0  # 0表示不用額外的進程來加速讀取數(shù)據(jù)
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數(shù)據(jù)集的邏輯封裝在d2lzh_pytorch.load_data_fashion_mnist函數(shù)中供后面章節(jié)調用。該函數(shù)將返回train_itertest_iter兩個變量娩脾。隨著本書內容的不斷深入赵誓,我們會進一步改進該函數(shù)。它的完整實現(xiàn)將在5.6節(jié)中描述柿赊。

最后我們查看讀取一遍訓練數(shù)據(jù)需要的時間俩功。

start = time.time()
for X, y in train_iter:
    continue
print('%.2f sec' % (time.time() - start))

輸出:

1.57 sec

小結

image.png

參考文獻

[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.


注:本節(jié)除了代碼之外與原書基本相同,原書傳送門

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末碰声,一起剝皮案震驚了整個濱河市诡蜓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胰挑,老刑警劉巖蔓罚,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瞻颂,居然都是意外死亡豺谈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門贡这,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茬末,“玉大人,你說我怎么就攤上這事盖矫±霾眩” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵炼彪,是天一觀的道長吐根。 經常有香客問我,道長辐马,這世上最難降的妖魔是什么拷橘? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮喜爷,結果婚禮上冗疮,老公的妹妹穿的比我還像新娘。我一直安慰自己檩帐,他們只是感情好术幔,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著湃密,像睡著了一般诅挑。 火紅的嫁衣襯著肌膚如雪四敞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天拔妥,我揣著相機與錄音忿危,去河邊找鬼。 笑死没龙,一個胖子當著我的面吹牛铺厨,可吹牛的內容都是我干的。 我是一名探鬼主播硬纤,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼解滓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了筝家?” 一聲冷哼從身側響起洼裤,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肛鹏,沒想到半個月后逸邦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恩沛,經...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡在扰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了雷客。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芒珠。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搅裙,靈堂內的尸體忽然破棺而出皱卓,到底是詐尸還是另有隱情,我是刑警寧澤部逮,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布娜汁,位于F島的核電站,受9級特大地震影響兄朋,放射性物質發(fā)生泄漏掐禁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一颅和、第九天 我趴在偏房一處隱蔽的房頂上張望傅事。 院中可真熱鬧,春花似錦峡扩、人聲如沸蹭越。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽响鹃。三九已至驾霜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間买置,已是汗流浹背寄悯。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留堕义,地道東北人猜旬。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像倦卖,于是被迫代替她去往敵國和親洒擦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內容