圖像分類數據集(Fashion-MNIST)tensorflow2.1
AIHUBEI 2020-06-15 23:00:51 110 收藏
分類專欄: 深度學習
版權
圖像分類數據集(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
1
2
3
4
5
6
7
print(tf.__version__)
1
2.1.0
1
通過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()
1
2
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
1
2
3
4
5
6
7
8
訓練集中和測試集中的每個類別的圖像數分別為6,000和1,000。因為有10個類別,所以訓練集和測試集的樣本數分別為60,000和10,000。
len(x_train),len(x_test)
1
(60000, 10000)
1
我們可以通過方括號[]來訪問任意一個樣本,下面獲取第一個樣本的圖像和標簽。
feature,label=x_train[0],y_train[0]
1
變量feature對應高和寬均為28像素的圖像。每個像素的數值為0到255之間8位無符號整數(uint8)。它使用二維ndarray數組儲。因為數據集中是灰度圖像,所以只有兩個維度,不需要第三個維度來區分通道。為了表述簡潔,我們將高和寬分別為 h 和 w 像素的圖像的形狀記為 h×w 或(h,w)。
feature.shape, feature.dtype
1
((28, 28), dtype('uint8'))
1
圖像的標簽使用NumPy的標量表示。注意,在keras的fashion_mnist數據和原書mxnet提供的數據集有差別
label, type(label), label.dtype
1
(9, numpy.uint8, dtype('uint8'))
1
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]
1
2
3
4
下面定義一個可以在一行里畫出多張圖像和對應標簽的函數。
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()
1
2
3
4
5
6
7
8
現在,我們看一下訓練數據集中前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))
1
2
3
4
5
讀取小批量
在訓練數據集上訓練模型,並將訓練好的模型在測試數據集上評價模型的表現。雖然我們可以像“線性回歸的從零開始實現”一節中那樣通過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)
1
2
3
4
5
6
最后我們查看讀取一遍訓練數據需要的時間。
start = time.time()
for X, y in train_iter:
continue
print('%.2f sec' % (time.time() - start))
1
2
3
4
0.17 sec
1
小結
Fashion-MNIST是一個10類服飾分類數據集,之后章節里將使用它來檢驗不同算法的表現。
我們將高和寬分別為 h 和 w 像素的圖像的形狀記為 h×w 或(h,w)。
————————————————
版權聲明:本文為CSDN博主「AIHUBEI」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/AIHUBEI/java/article/details/106773168