In [1]:
#import tensorflow, 無論 CPU 或 GPU 版本都是 import tensorflow as tf
import tensorflow as tf
In [2]:
#將MNIST 手寫數字資料讀進來
mnist = tf.keras.datasets.mnist

# mnist 的load_data()會回傳已經先分割好的training data 和 testing data
# 並且將每個 pixel 的值從 Int 轉成 floating point 同時做normalize(這是很常見的preprocessing)
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
In [3]:
print(len(x_train)) #training data 總共有60000張圖片
print(x_train[0].shape) #每張圖片(拿第一張當樣本)大小為 28x28
60000
(28, 28)
In [4]:
# 開始搭建model
# 利用 "Sequential" 把每層 layer 疊起來

# input 大小為 28 x 28

# 最後的 Dense(10) 且 activation 用 softmax
# 代表最後 output 為 10 個 class (0~9)的機率
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

# model每層定義好後需要經過compile
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
In [5]:
# 將搭好的 model 去 fit 我們的 training data
# 並evalutate 在 testing data 上
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test, verbose=2)
Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 5s 78us/sample - loss: 0.3006 - accuracy: 0.9127
Epoch 2/5
60000/60000 [==============================] - 4s 67us/sample - loss: 0.1432 - accuracy: 0.9574
Epoch 3/5
60000/60000 [==============================] - 4s 70us/sample - loss: 0.1074 - accuracy: 0.9666
Epoch 4/5
60000/60000 [==============================] - 4s 67us/sample - loss: 0.0882 - accuracy: 0.9732
Epoch 5/5
60000/60000 [==============================] - 4s 68us/sample - loss: 0.0755 - accuracy: 0.9765
10000/1 - 0s - loss: 0.0391 - accuracy: 0.9768
Out[5]:
[0.07640696551923175, 0.9768]