[Deep Learning] Keras 手寫辨識 MNIST
幼幼班來惹
可以在 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 = 10history = 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 來用.