用tensorflow2實現mnist手寫數字識別

hzcya發表於2020-11-11

1.匯入依賴包

將tensorflow和numpy匯入

from tensorflow import keras
from tensorflow.keras.layers import Flatten, Dense
import numpy as np

2.載入資料集

使用tensorflow內建的mnist資料集,返回訓練集圖片、訓練集標籤、測試集圖片、測試集標籤

(train_images, train_labels), (test_images, test_labels) = keras.datasets.mnist.load_data()

3.對圖片進行歸一化

圖片每個畫素的數值都是在[0, 255]之間,所以歸一化要除以255,資料要是浮點數,所以要新增一個小數點

train_images, test_images = train_images / 255.0, test_images / 255.0

4.定義模型

搭建一個順序模型,第一層先將資料展平,原始圖片是28x28的灰度圖,所以輸入尺寸是(28,28),第二層節點數可以自己選擇一個合適值,這裡用128個節點,啟用函式用relu,第三層有多少個種類就寫多少,[0, 9]一共有10個數字,所以必須寫10,啟用函式用softmax

model = keras.Sequential([
    Flatten(input_shape=(28, 28)),
    Dense(128, activation='relu'),
    Dense(10, activation='softmax')
])

5.指定最佳化器、損失函式、評價指標

最佳化器使用adam,損失函式使用交叉熵損失函式,評價指標用準確率

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['acc'])

6.訓練模型

將訓練集輸入模型進行訓練,一共訓練10次

model.fit(train_images, train_labels, epochs=10)
Epoch 1/101875/1875 [==============================] - 3s 2ms/step - loss: 0.2575 - acc: 0.9261Epoch 2/101875/1875 [==============================] - 3s 2ms/step - loss: 0.1135 - acc: 0.9661Epoch 3/101875/1875 [==============================] - 3s 2ms/step - loss: 0.0776 - acc: 0.9764Epoch 4/101875/1875 [==============================] - 3s 2ms/step - loss: 0.0589 - acc: 0.9818Epoch 5/101875/1875 [==============================] - 3s 2ms/step - loss: 0.0452 - acc: 0.9861Epoch 6/101875/1875 [==============================] - 3s 2ms/step - loss: 0.0371 - acc: 0.9890Epoch 7/101875/1875 [==============================] - 3s 2ms/step - loss: 0.0279 - acc: 0.9912Epoch 8/101875/1875 [==============================] - 3s 2ms/step - loss: 0.0226 - acc: 0.9932Epoch 9/101875/1875 [==============================] - 3s 2ms/step - loss: 0.0203 - acc: 0.9935Epoch 10/101875/1875 [==============================] - 3s 2ms/step - loss: 0.0153 - acc: 0.9954

Out[6]:

<tensorflow.python.keras.callbacks.History at 0x24ecdc1c460>

7.用測試集驗證模型效果

用測試集去驗證訓練好的模型,日誌等級設定為2

test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print('Test acc:', test_acc)
313/313 - 0s - loss: 0.0845 - acc: 0.9791Test acc: 0.9790999889373779

8.將圖片輸入模型,返回預測結果

將測試集中的第一張圖片輸入模型,看是哪個數字的機率最大,並輸出真實值

predictions = model.predict(test_images)
print('預測值:', np.argmax(predictions[0]))
print('真實值:', test_labels[0])
預測值: 7真實值: 7


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69978904/viewspace-2733646/,如需轉載,請註明出處,否則將追究法律責任。

相關文章