Home >> Blog >> 什麼是MNIST?為什麼它很重要?

每周我們都會在執行完SEO search engine optimization 搜尋引擎優化 的案子後,花一些時間來討論我們平常會用到的一些軟體工具或是業界新知。

什麼是MNIST?為什麼它很重要?

介紹

在本教學中,我們將討論 MNIST(修改後的國家標準與技術研究院)資料庫。可以說,MNIST 手印字符圖像資料庫是機器學習的“Hello World”實現,該資料庫被用作全球機器學習基準。對於想要在現實世界數據上嘗試機器學習技術和模式識別方法,同時在數據預處理和格式化上花費最少時間和精力的人來說,它是一個非常好的資料庫。它的簡單性和易用性是使該資料庫如此廣泛使用和深入理解的原因。因此,本教學的目標是向您展示如何在使用卷積神經網絡 (CNN) 的數字識別示例中使用該資料庫,從而在測試資料庫上實現高分類精度。從更大的角度來看,我們將強調 MNIST 在機器學習領域的重要性和影響。所以讓我們潛入水中吧!

先決條件

要學習本教學,您應該具備一些機器學習的基礎知識,包括神經網絡,以及任何語言(最好是 Python)的基本程式編寫知識。除此之外,本文的其餘部分對初學者非常友好。

我們還將使用Google 提供的Colaboratory來編寫我們的程式碼。

關於 MNIST

MNIST 是一個大型資料庫,包含 0 到 9 之間的手寫單個數字的 28 到 28 像素的小正方形灰度圖像。它由總共 70,000 張手寫數字圖像組成,訓練集有 60,000 張圖像,測試集有 10,000 張圖像。所有圖像都標有它們所代表的相應數字。共有 10 類數字(從 0 到 9)。

使用 MNIST 進行數字識別

我們的任務是將手寫數字的給定圖像分類為代表從 0 到 9 的整數值的 10 個類別之一,包括使用能夠識別手寫數字的 CNN。CNN 是一種通常用於計算機視覺應用的深度神經網絡。所以我們將在 MNIST 資料庫上構建一個圖像分類器 TensorFlow 的 Keras API。Keras 是一個 Python 庫,由於其平滑的學習曲線,強烈推薦給初學者。它在實現神經網絡中非常常用。有關Keras的更多信息,請點擊此鏈接。

第 1 步:導入和探索 MNIST 資料庫

下面的示例使用 Keras API 加載 MNIST 資料庫。數字圖像分為兩組:x_train, x_test 和 y_train, y_test。x_train 和 x_test 部分包含灰度 RGB 程式碼(從 0 到 255)。y_train 和 y_test 部分包含從 0 到 9 的標籤。

# 從 keras.datasets 加載 mnist 資料庫
import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

數字圖像分為兩組:訓練和測試。x_train 和 x_test 部分包含灰度 RGB 程式碼(從 0 到 255)。y_train 和 y_test 部分包含從 0 到 9 的標籤。通過運行以下示例,我們可以看到訓練集包含 60,000 張圖像,而測試集包含 10,000 張圖像,並且這些圖像確實是 28x28 像素的正方形:

# 顯示資料庫摘要
print('X_train = %s, Y_train = %s' % (x_train.shape, y_train.shape))
print('X_test = %s, Y_test = %s' % (x_test.shape, y_test.shape ))

輸出:

X_train = (60000, 28, 28), Y_train = (60000)
X_test = (10000, 28, 28), Y_test = (10000)

運行以下程式碼也可以看到資料庫中前九幅圖像的圖:

# 繪製 mnist 資料庫中的前 9 個圖像
import matplotlib.pyplot as plt
for x in range(9):
plt.subplot(330 + 1 + x)
plt.imshow(x_train[x], cmap=plt.get_cmap('gray '))
plt.show()

輸出:

![](https://res.cloudinary.com/carpool199/image/upload/v1584625154/img1.png)

第 2 步:重塑資料庫中的圖像

我們需要將資料庫重塑為 4 維 NumPy 數組,以便能夠在 Keras 中使用它。通過查看上面的輸出之一,我們知道資料庫是 3 維的,因為 x_train 表示 (60000,28,28),其中 60000 是訓練集中的圖像數量,(28,28) 表示每個圖像。因此,讓我們使用以下程式碼將它們轉換為 4 維數組:

# 將數組重塑為 4 維
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
input_shape = ( 28, 28, 1)
# 保證除法後小數點
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
print('reshaping後x_train為:', x_train.shape)
print( 'x_train 包含', x_train.shape[0], "images")
print('x_test contains', x_test.shape[0], "images")

輸出:

重塑後,x_train 為: (60000, 28, 28, 1)
x_train 包含 60000 張圖片
x_test 包含 10000 張圖片

第 3 步:規範化資料庫中的圖像

歸一化是改變像素強度值範圍以使圖像進入感官更熟悉或更正常的範圍的過程。我們必須標準化我們的數據,因為它在神經網絡模型中總是需要的。這可以通過將 RGB 程式碼除以 255 來實現,即最大 RGB 程式碼減去最小 RGB 程式碼 (255 -0 )。因此,讓我們使用以下程式碼規範化我們的圖像:

# 通過除以最大 RGB 值 (255) 對圖像進行歸一化
x_train /= 255
x_test /= 255

第 4 步:構建卷積神經網絡

模型和層是 Keras 的構建塊,它們可以幫助您構建深度神經網絡。所以我們將創建一個順序模型並開始向它添加層。該模型由兩個組件組成:

1.由卷積層和池化層組成的特徵提取前端

2.將進行預測的分類器後端

對於特徵提取前端,我們從具有 32 個濾波器和 (3,3) 內核大小的 2D 卷積層開始。該層基本上是一個蒙版,可用於圖像中的模糊、銳化、浮雕和邊緣檢測。它使用激活函數整流器線性單元——ReLU。激活函數是深度神經網絡的核心,沒有它,您只能將線性模型擬合到您的數據中。卷積層之後是最大池化層。然後可以將過濾器映射展平以向分類器提供特徵。

由於這是一個多類分類問題,有 10 個可能的結果(從 0 到 9 總共有 10 位數字),輸出層將由 10 個節點組成,需要最適合多類分類任務的 softmax 激活函數。我們還添加了一個密集層來解釋具有 100 個節點的特徵。提供的模型解釋程式碼如下:

# 創建一個名為的順序模型並為其添加層
from keras import models
from keras import layers
network = models.Sequential()
network.add(layers.Conv2D(32, (3, 3), activation='relu', kernel_initializer= 'he_uniform', input_shape=(28, 28, 1)))
network.add(layers.MaxPooling2D((2, 2)))
network.add(layers.Flatten())
network.add(layers.Dense(100,激活='relu', kernel_initializer='he_uniform'))
network.add(layers.Dense(10, activation='softmax'))

第 5 步:編譯和擬合模型

到目前為止,我們已經創建了一個未優化的空 CNN。因此,我們現在將通過提供 3 個關鍵參數來編譯我們的網絡:優化器、損失函數和我們將監控的指標。

有不同類型的優化器、損失函數和指標,但是,我們不會深入研究這些細節。對於這個例子,你需要做的就是我們選擇 Adam 作為優化算法,因為它是高效的並且最適合具有很多參數的問題,比如我們自己的。對於損失函數,我們選擇了稀疏分類交叉熵,因為我們正在處理多類分類問題。此函數有效地計算實際輸出與模型預測的輸出之間的差異,這反過來又是預測中的誤差。這個錯誤作為反饋提供給優化器(Adam),優化器在每次迭代中都會提出一個更好的模型。為了監控我們的指標,我們選擇了非常標準的準確度。

最後,我們使用 fit 方法在資料庫上訓練模型,我們已經進行了 10 個訓練 epoch。Epoch 是您迭代整個資料庫的次數。程式碼如下:

network.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
network.fit(x=x_train,y=y_train, epochs= 10)

輸出:

CyberLink U 會議回顧

第 6 步:績效評估

作為最後一步,我們僅使用一行程式碼評估了帶有 x_test 和 y_test 的訓練模型:

# 確定訓練模型的準確性
network.evaluate(x_test, y_test)

輸出:

CyberLink U 會議回顧

從上面可以看出,我們已經達到了 98.78% 的準確率,這是相當不錯的。

結論

在本教學中,我們討論了 MNIST 資料庫是什麼,以及為什麼它的簡單性、易用性和對真實數據的應用使其成為機器學習中的資料庫基準。我們進一步解釋了它在使用卷積神經網絡的數字識別示例中的用途,並獲得了相當高的準確度。

你需要像 MNIST 這樣的資料庫嗎?

像 MNIST 這樣的資料庫很難組合。它不僅難以收集,而且很難僅針對您的特定需求對其進行預處理。因此,尋找另一個為您完成這些繁重工作的服務會更有效率。我們可以成為您的完美解決方案!

在Selectstar,我們將我們的任務眾包給全球不同的用戶,以確保按時完成質量和數量。此外,我們的內部經理會仔細檢查收集或處理數據的質量。讓它成為您的專業資料庫或學術資料庫。我們是來幫忙的!