【CV04】如何使用 Keras 可視化經典的計算機視覺數據集

本文通過MNIST,Fashion-MNIST,CIFAR-10和CIFAR-100計算機視覺數據集介紹Keras加載圖像數據並可視化的方法。



1. Keras計算機視覺數據集

Keras提供對四個標準計算機視覺數據集的訪問,分別是:

  • MNIST:對10類手寫數字的圖片進行分類;
  • Fashion-MNIST:對10類衣物圖片進行分類;
  • CIFAR-10:對10類物體圖片進行分類;
  • CIFAR-100:對100類常見物體圖片進行分類。

數據集可通過數據集加載函數keras.datasets模塊下使用。調用 load 函數後,數據集將下載並存儲在 C:\Users\34123\.keras\datasets 目錄下,數據集以壓縮格式存儲。首次調用數據集加載函數並下載了數據集之後,無需再次下載數據集,後續調用將從磁盤加載數據集。

加載函數返回兩個元組,第一個包含訓練數據集中樣本的輸入和輸出元素,第二個包含測試數據集中樣本的輸入和輸出元素。訓練數據集和測試數據集之間的拆分通常遵循標準拆分,該標準拆分用於對數據集進行基準測試時使用。

加載數據集的標準習慣用法如下:

...
# load dataset
(trainX, trainy), (testX, testy) = load_data()

X和y分別是像素或類值的NumPy數組。

其中兩個數據集包含灰度圖像,兩個數據集包含彩色圖像。灰度圖像的形狀必須從二維陣列轉換爲三維陣列,以匹配Keras的首選通道順序。例如:

# 給灰度圖添加通道數
width, height, channels = trainX.shape[1], trainX.shape[2], 1
trainX = trainX.reshape((trainX.shape[0], width, height, channels))
testX = testX.reshape((testX.shape[0], width, height, channels))

灰度和彩色圖像像素數據均存儲爲0到255之間的無符號整數值。在建模之前,需要將圖像數據重新縮放,例如歸一化到0-1範圍,例如:

# normalize pixel values
trainX = trainX.astype('float32') / 255
testX = testX.astype('float32') / 255

每個樣本的輸出y都存儲爲類整數值。對於多類分類問題,通常的做法是在建模之前對類值進行one-hot編碼。可以使用Keras的 to_categorical() 函數來實現。例如:

...
# one hot encode target values
trainy = to_categorical(trainy)
testy = to_categorical(testy)

接下來,詳細探究相關的數據集。

2.MNIST數據集

該數據集包含60,000個在0到9之間的手寫數字圖片,每張圖片爲28×28像素的灰度圖。表現最好的模型是深度學習卷積神經網絡,其分類精度達到99%以上,在保留測試數據集上的錯誤率在0.4%和0.2%之間。

from keras.datasets import mnist
import matplotlib.pyplot as plt
plt.rcParams['figure.dpi'] = 200

(trainX, trainy), (testX, testy) = mnist.load_data()
print('Train: X=%s, y=%s' % (trainX.shape, trainy.shape))
print('Test: X=%s, y=%s' % (testX.shape, testy.shape))

for i in range(9):
    plt.subplot(330 + 1 + i)
    plt.imshow(trainX[i], cmap=plt.get_cmap('gray'))
    
plt.tight_layout()
plt.show()

輸出:

Train: X=(60000, 28, 28), y=(60000,)
Test: X=(10000, 28, 28), y=(10000,)

在這裏插入圖片描述


3. Fashion-MNIST數據集

該數據集包含60,000個10種類型的衣服圖片,每張圖片爲28×28像素的灰度圖。與MNIST相比,這是一個更具挑戰性的分類問題,通過深度學習卷積網絡可在保持測試數據集上實現約95%至96%的分類精度,從而獲得最佳結果。

from keras.datasets import fashion_mnist

(trainX, trainy), (testX, testy) = fashion_mnist.load_data()
print('Train: X=%s, y=%s' % (trainX.shape, trainy.shape))
print('Test: X=%s, y=%s' % (testX.shape, testy.shape))

for i in range(9):
    plt.subplot(330 + 1 + i)
    plt.imshow(trainX[i], cmap=plt.get_cmap('gray'))
    
plt.tight_layout()
plt.show()

輸出:

Downloading data from http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 1s 100us/step
Downloading data from http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 71s 16us/step
Train: X=(60000, 28, 28), y=(60000,)
Test: X=(10000, 28, 28), y=(10000,)

在這裏插入圖片描述

3. CIFAR-10數據集

CIFAR是Canadian Institute For Advanced Research的首字母縮寫,CIFAR-10數據集是由CIFAR研究所的研究人員與CIFAR-100數據集一起開發的。

該數據集包含10類物體的60,000張32×32像素彩色照片組成,如青蛙,鳥類,貓,船等。

CIFAR-10被廣泛用於在機器學習領域對計算機視覺算法進行基準測試。通過深度學習卷積神經網絡在測試數據集上的分類精度高於96%或97%,可以實現該問題的最佳性能。

from keras.datasets import cifar10

(trainX, trainy), (testX, testy) = cifar10.load_data()
print('Train: X=%s, y=%s' % (trainX.shape, trainy.shape))
print('Test: X=%s, y=%s' % (testX.shape, testy.shape))

for i in range(9):
    plt.subplot(330 + 1 + i)
    plt.imshow(trainX[i], cmap=plt.get_cmap('gray'))
    
plt.tight_layout()
plt.show()

輸出:

Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170500096/170498071 [==============================] - 135s 1us/step
Train: X=(50000, 32, 32, 3), y=(50000, 1)
Test: X=(10000, 32, 32, 3), y=(10000, 1)

在這裏插入圖片描述


4. CIFAR-100數據集

該數據集由100類物體(如魚,花,昆蟲等)的60,000張32×32像素彩色照片組成。

from keras.datasets import cifar100

(trainX, trainy), (testX, testy) = cifar100.load_data()
print('Train: X=%s, y=%s' % (trainX.shape, trainy.shape))
print('Test: X=%s, y=%s' % (testX.shape, testy.shape))

for i in range(9):
    plt.subplot(330 + 1 + i)
    plt.imshow(trainX[i], cmap=plt.get_cmap('gray'))
    
plt.tight_layout()
plt.show()

輸出:

Downloading data from https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz
169009152/169001437 [==============================] - 148s 1us/step
Train: X=(50000, 32, 32, 3), y=(50000, 1)
Test: X=(10000, 32, 32, 3), y=(10000, 1)

在這裏插入圖片描述
Keras返回100類的默認標籤,但標籤可以通過 label_mode 參數設置爲“ 粗糙 ”(即只有20類標籤),當使用 to_categorical() 函數對標籤進行one-hot編碼時,區別就很明顯了,其中不是每個輸出向量都具有100維,而是隻有20個。如:

from keras.datasets import cifar100
from keras.utils import to_categorical

(trainX, trainy), (testX, testy) = cifar100.load_data(label_mode='coarse')

trainy = to_categorical(trainy)
testy = to_categorical(testy)

print('Train: X=%s, y=%s' % (trainX.shape, trainy.shape))
print('Test: X=%s, y=%s' % (testX.shape, testy.shape))

輸出:

Train: X=(50000, 32, 32, 3), y=(50000, 20)
Test: X=(10000, 32, 32, 3), y=(10000, 20)

運行示例將像以前一樣加載CIFAR-100數據集,但是現在將圖像分類爲屬於20個類之一。


參考:
https://machinelearningmastery.com/how-to-load-and-visualize-standard-computer-vision-datasets-with-keras/

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