用Keras进行手写字体识别(MNIST数据集)
數據
首先加載數據
from keras.datasets import mnist(train_images, train_labels), (test_images, test_labels) = mnist.load_data()接下來,看看這個數據集的基本情況:
train_images.shape(60000, 28, 28)
len(train_labels)60000
train_labelsarray([5, 0, 4, …, 5, 6, 8], dtype=uint8)
test_images.shape(10000, 28, 28)
len(test_labels)10000
test_labelsarray([7, 2, 1, …, 4, 5, 6], dtype=uint8)
網絡構架
from keras import models from keras import layersnetwork = models.Sequential() network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,))) network.add(layers.Dense(10, activation='softmax'))Keras可以幫助我們實現一層一層的連接起來,在本例中的網絡包含2個Dense層,他們是密集連接(也叫全連接)的神經層。第二層是一個10路softmax層,他將返回一個由10個概率值(總和為1)組成的數組。每個概率值表示當前數字圖像屬于10個數字類別中的某一個的概率。
編譯
要想訓練網絡,我們還需要設置編譯步驟的三個參數:
-
損失函數
-
優化器(optimizer):基于訓練數據和損失函數來更新網絡的機制
-
在訓練和測試過程中需要監控的指標(metric):本例只關心精度,即正確分類的圖像所占的比例。
圖像數據預處理
在訓練之前,需要對圖像數據預處理,將其變換成網絡要求的形狀,并縮放所有值都在[0,1]區間。比如,之前訓練圖像保存在一個uint8類型的數組中,其形狀為(60000,28, 28),取值范圍為[0, 255]。我們需要將其變換成一個float32數組,其形狀為(60000, 28*28),取值范圍為0-1
train_images = train_images.reshape((60000, 28 * 28)) #把一個圖像變成一列數據用于學習 train_images = train_images.astype('float32') / 255 #astype用于進行數據類型轉換test_images = test_images.reshape((10000, 28 * 28)) test_images = test_images.astype('float32') / 255訓練
from keras.utils import to_categoricaltrain_labels = to_categorical(train_labels) test_labels = to_categorical(test_labels)network.fit(train_images, train_labels, epochs=5, batch_size=128)會有一個輸出
看看測試集表現如何:
test_loss, test_acc = network.evaluate(test_images, test_labels)print('test_acc:', test_acc)我們還可以看某一個具體的圖像顯示情況
digit = train_images[4] import matplotlib.pyplot as plt plt.imshow(digit, cmap = plt.cm.binary) plt.show()更多精彩內容,歡迎關注我的微信公眾號:數據瞎分析
總結
以上是生活随笔為你收集整理的用Keras进行手写字体识别(MNIST数据集)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重写描述符(property)魔法方法时
- 下一篇: 房价预测:回归问题