“Is artificial intelligence less than our intelligence?” —Spike Jonze
手寫數字辨識堪稱是深度學習界的Hello World!,為了避免環境問題,我們這次使用Google Colab作為我們的環境(Google Colab提供雲端運算資源,供程式執行):
import numpy as np
import tensorflow as tf
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Input
train_X是一個(60000, 28, 28)的陣列,等於是60000張28*28的圖片。
train_y代表這60000張,每張所對應到的數字(也就是一張圖片它是數字幾)。
如果我們要評估一個模型是不是好的模型,就得拿不在訓練集裡的輸入(沒看過的圖片),才能看出這個模型的準確率如何。
因此我們不會把我們所擁有的所有圖片拿來訓練,而是會分成訓練集跟測試集兩組!
標準化指的是把每個像素點的灰階值(0~255),全部壓縮到0~1之間。
(延伸思考:為什麼要標準化呢?)
把輸出結果分成10類
將原本的X_train從(60000, 28, 28)變成(60000, 784),X_test同理。
(train_X, train_y), (test_X, test_y) = tf.keras.datasets.mnist.load_data() #load data from mnist
# 標準化
X_train = train_X.astype('float')/255
X_test = test_X.astype('float')/255
# 分類
y_train = tf.keras.utils.to_categorical(train_y, 10)
y_test = tf.keras.utils.to_categorical(test_y, 10)
# reshape到ANN的輸入格式 60000張, 784維
X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)
ANN_model = Sequential([
Input(shape = (784,)), # 建立輸入層
Dense(units=128, kernel_initializer='normal', activation='relu'), # 建立隱藏層
Dense(units=64, kernel_initializer='normal', activation='relu'), # 建立隱藏層
Dense(units=10, kernel_initializer='normal', activation='softmax')
])
ANN_model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['acc'])
(延伸思考:這些參數是做什麼的?)
ANN_model_History = ANN_model.fit(
X_train,
y_train,
batch_size= 128,
epochs=10,
validation_split=0.2,
)
ANN_model.save('ANN_NumberPredict.h5')
(延伸思考:嘗試解釋batch_size和epochs為何存在)
validation_split是在訓練過程中再拆分出測試集,這樣可以幫助模型了解自己現在模型的成效如何。
ANN_model.evaluate(X_test, y_test)
模型到這邊就訓練完了!
import keras
ANN_model = keras.models.load_model('./ANN_NumberPredict.h5')
下一篇會講解要怎麼將手機拍的照片透過我們這個模型進行預測!