[Deep Learning] Keras 手寫辨識 MNIST

Bryan Yang
A multi hyphen life
6 min readMar 18, 2018

幼幼班來惹

可以在 Colab 上用免費的 GPU 後,就有動力開始玩 Deep Learning 了.偉哉谷歌讚嘆谷歌.本來我都是 Pytorch 派,但是因為公司用的 GCP 上面的 Cloud ML 只適用 google 自家的 Tensor Flow,所以還是得學一下 Tensorflow QQ.不過好險網路上很多神人,把 Tensorflow 包成更高階的 API — Keras

千解釋萬解釋不如一行 Demo Code,以下直接進 Demo.

GCP 資訊

先看一下 GPU 的資訊:

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, LeakyReLU, Conv2D
from keras.optimizers import RMSprop
from keras import backend as K
K.tensorflow_backend._get_available_gpus()
from matplotlib.pyplot import imshow
import numpy as np

把等下要用的東西 import 進來後,Keras 自己有提供一些 dataset 可以玩,今天用的 MNIST 就是很標準的資料集.

MNIST

http://yann.lecun.com/exdb/mnist/ 這邊有蒐集不同演算法訓練的結果,例如 KNN、SVM 等等,今天會用簡單的兩層 NN 來算.

每個資料長得像這樣 28 x 28 的黑白數字圖案:

資料整理

# the data, shuffled and split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

然後再看一下預測目標,原本的 y 是 0–9 的數字,需要先做一次 one-hot encoding.

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

疊 Model

用 Keras 最爽的就是,Keras 透過 Pipeline 的方式將不同 layer 的神經網絡碟在一起,只要指定各層的類型、要幾個 dimension 、activation function ,就可以建立 Model.

model = Sequential()
model.add(Dense(20, activation=LeakyReLU(), input_shape=(784,)))
model.add(Dense(20, activation=LeakyReLU()))
model.add(Dense(10, activation='softmax'))
model.summary()

用法簡單到不用解釋XD:指定 model 後,透過 model.add 的方式由前向後加層,不用自己去手刻 forward functino.(但是相對也比較不彈性啦,一體兩面)

這邊用的是簡單 NN 模型,前兩層有 20 個節點,activation function 是 LeakyReLU.只有第一層要指定 input 資料放進去的形狀,之後都會自己處理.

最後一層因為要輸出十個類別,所以用了 10 個節點的 softmax.

從這個 summary 可以看得出來每一層用的 layer、有幾個節點、總共有多少參數要算等重要資訊.

訓練囉

model.compile(loss='categorical_crossentropy',
optimizer=RMSprop(),
metrics=['accuracy'])

Keras 是靜態模型,需要先 compile 之後才能 train.在 compile 時需要指定 loss function 、優化演算法、以及訓練時要看的 metrics.

batch_size = 128
num_classes = 10
epochs = 10
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))

最後要 train 的時候,需要給定訓練資料及的x、y、batch_size(每次要放幾筆資料)、epochs(總共要訓練幾次)、以及用來做 validation 的data set.

可以看到 Keras 把整個訓練過程包得非常好,每次 epoch 會顯示訓練和 validation 資料的 loss 和 accuracy 等資訊,非常的方便.

結果

這是剛剛 test 的 dataset,下次試試看把模型存起來直接拿 pre-train model 來用.

--

--

Bryan Yang
A multi hyphen life

Data Engineer, Data Producer Manager, Data Solution Architect