圖像分類數據集(Fashion-MNIST)tensorflow2.1

圖像分類數據集(Fashion-MNIST)

xiaoyao 動手學深度學習 tensorflow2.1.0

在介紹softmax迴歸的實現前先引入一個多類圖像分類數據集。它將在後面的章節中被多次使用,以方便我們觀察比較算法之間在模型精度和計算效率上的區別。圖像分類數據集中最常用的是手寫數字識別數據集MNIST [1]。但大部分模型在MNIST上的分類精度都超過了95%。爲了更直觀地觀察算法之間的差異,我們將使用一個圖像內容更加複雜的數據集Fashion-MNIST [2]。

獲取數據集

首先導入需要的包或模塊。

import tensorflow as tf
from tensorflow import keras

import numpy as np
import time
import sys
import matplotlib.pyplot as plt
print(tf.__version__)
2.1.0

通過keras的dataset包來下載這個數據集。第一次調用時會自動從網上獲取數據。我們通過參數train來指定獲取訓練數據集或測試數據集(testing data set)。測試數據集也叫測試集(testing set),只用來評價模型的表現,並不用來訓練模型。

from tensorflow.keras.datasets import fashion_mnist
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 1s 33us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 21s 1us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0s/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 12s 3us/step

訓練集中和測試集中的每個類別的圖像數分別爲6,000和1,000。因爲有10個類別,所以訓練集和測試集的樣本數分別爲60,000和10,000。

len(x_train),len(x_test)
(60000, 10000)

我們可以通過方括號[]來訪問任意一個樣本,下面獲取第一個樣本的圖像和標籤。

feature,label=x_train[0],y_train[0]

變量feature對應高和寬均爲28像素的圖像。每個像素的數值爲0到255之間8位無符號整數(uint8)。它使用二維ndarray數組儲。因爲數據集中是灰度圖像,所以只有兩個維度,不需要第三個維度來區分通道。爲了表述簡潔,我們將高和寬分別爲 h 和 w 像素的圖像的形狀記爲 h×w 或(h,w)。

feature.shape, feature.dtype
((28, 28), dtype('uint8'))

圖像的標籤使用NumPy的標量表示。注意,在keras的fashion_mnist數據和原書mxnet提供的數據集有差別

label, type(label), label.dtype
(9, numpy.uint8, dtype('uint8'))

Fashion-MNIST中一共包括了10個類別,分別爲t-shirt(T恤)、trouser(褲子)、pullover(套衫)、dress(連衣裙)、coat(外套)、sandal(涼鞋)、shirt(襯衫)、sneaker(運動鞋)、bag(包)和ankle boot(短靴)。以下函數可以將數值標籤轉成相應的文本標籤。

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]

下面定義一個可以在一行裏畫出多張圖像和對應標籤的函數。

def show_fashion_mnist(images, labels):
    _, figs = plt.subplots(1, len(images), figsize=(12, 12))
    for f, img, lbl in zip(figs, images, labels):
        f.imshow(img.reshape((28, 28)))
        f.set_title(lbl)
        f.axes.get_xaxis().set_visible(False)
        f.axes.get_yaxis().set_visible(False)
    plt.show()

現在,我們看一下訓練數據集中前9個樣本的圖像內容和文本標籤

X, y = [], []
for i in range(10):
    X.append(x_train[i])
    y.append(y_train[i])
show_fashion_mnist(X, get_fashion_mnist_labels(y))

在這裏插入圖片描述

讀取小批量

在訓練數據集上訓練模型,並將訓練好的模型在測試數據集上評價模型的表現。雖然我們可以像“線性迴歸的從零開始實現”一節中那樣通過yield來定義讀取小批量數據樣本的函數,但爲了代碼簡潔,這裏我們直接創建DataLoader實例。該實例每次讀取一個樣本數爲batch_size的小批量數據。這裏的批量大小batch_size是一個超參數

此外,我們通過ToTensor實例將圖像數據從uint8格式變換成32位浮點數格式,併除以255使得所有像素的數值均在0到1之間。ToTensor實例還將圖像通道從最後一維移到最前一維來方便之後介紹的卷積神經網絡計算。通過數據集的transform_first函數,我們將ToTensor的變換應用在每個數據樣本(圖像和標籤)的第一個元素,即圖像之上。

batch_size = 256
if sys.platform.startswith('win'):  # startswith() 方法用於檢查字符串是否是以指定子字符串開頭,如果是則返回 True,否則返回 False。
    num_workers = 0  # 0表示不用額外的進程來加速讀取數據
else:
    num_workers = 4
train_iter = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(256)

最後我們查看讀取一遍訓練數據需要的時間。

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

小結

  • Fashion-MNIST是一個10類服飾分類數據集,之後章節裏將使用它來檢驗不同算法的表現。
  • 我們將高和寬分別爲 h 和 w 像素的圖像的形狀記爲 h×w 或(h,w)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章