2018/12/30

Keras 簡介

22 Keras 簡介
Keras 算是比較高階的套件,使用時的設定較簡易,使用如Tensorflow 或 Theano 為後台(Backend),所以系統必需安裝兩者之任一種,在此我們是使用Tensorflow。Keras 是以模組化的方式執行,就像是用 AI2 設計Android 程式一樣是以模組疊加起來執行程式的功能,只差AI2 使用圖形介面而keras 並無圖介面,必需使用程式碼完成模組化的方塊。Keras 裡最重要的兩種模組是 model 和 layer, model 是系統的核心 API, 提供各種 method, 如 compile(), fit(), summary(), evaluate() 等可用來執行深度學習。而layer 就是神經元的每一層,很多不同的layer組合起來就是一個model 。若是還沒安裝keras 可於虛擬環境下用下列指安裝
pip install kearas

model API 分為Sequential (循序型) 和 Functional(多功能型)。Sequential API 用於簡單的 model由簡單的layers 串接組成。Functional API 用於多輸入多輸出,layers 可有分支並可共用而組成複雜模型。簡單的keras 的工作流程如下
  • 創建 model
  • 創建和添加layer 到model, 創建後如需要可用summary() method 查看model.
  • compile (編譯) model
  • Train model
  • 訓練完成後可用於prediction (預測) 或 evaluation (評估)
🔶 Create Sequential models
要建立Sequence() 有兩種方法,一種是先建立一個空的model,再依序加入layers,如
model = Sequential()
model.add(Dense(128, input_dim=n_inputs, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(10, activation='softmax'))
另一種方是在 constructor 中直接加入layers 如
model = Sequential([Dense(128, input_dim=n_inputs, activation='relu'),
                 Dense(32, activation='relu'),
                 Dense(10, activation='softmax')
                   ])
上例中創建了一個含有三個一般全連接層Desnse()的model。Keras 允許將activation 獨立當成一個層串在Neuron層的後面,如上例輸入層可寫成
model.add(Dense(128, input_dim=n_inputs)
model.add(Activation='relu')
🔶 Create Functional models
可用Input() layer 及其他種類的layers 建立想要的拓撲連接,最後再將inputs 及 outputs 代入Model() class 的constructor,例如
input = Input(shape=(64,))
hidden1 = Dense(10)(input)
hidden2 = Activation('tanh')(hidden1)
hidden3 = Dense(10)(hidden2)
output = Activation('tanh')(hidden3)
model = Model(inputs=input, outputs=output)
🔶 常用的 core layers
核心層是基本的單元,以下列出幾種常用的
  • Dense() (稠密之意):這是一個簡單的全連接層,可接受的參數如輸出的連接數 、輸入的連接(當只有在第一層才需宣告,後續各層的輸人就是上一層的輸出數)、作動函數(若沒宣告預設的是線性輸出亦即 $y(x)=w\cdot x+b$)等。
  • Activation(): 此層可用也可不用,使用時是接在如Desne() 等Neuron 層的後面,執行作動函數 ,可使用的函數如softmax, elu, selu, softplus, softsign, relu, tanh, sigmoid, hard sigmoid, and linear。
  • Dropout() (棄置之意):是指對輸入一定的棄置率來執行棄置調節。
  • Flatten() (展平之意): 是用以把多維的輸入展平成一維。
  • Reshape() (重塑之意): 是用以改變object 的維度及各維大小。
  • Permute() (排列之意): 以一定的式樣對輸入重新排列。
  • Lambda() ($\lambda$) : 用以包裝使 用者自訂的函數。
🔶 其他的各種層
這裡只是簡單介紹 keras,要深入了解keras各種層的用法就得參考冊官方線上文件。以下僅列出一些功能比較重要的層。
► convolutional (摺積)layers:
  • Conv1D, Conv2D, Conv2D : 對input進行1D, 2D, 3D的摺積.
  • ropping1D, Cropping2D, Cropping3D:對input進行1D, 2D, 3D的修整.
  • UpSampling1D, UpSampling2D, UpSampling3D:向上取樣
  • ZeroPadding1D, ZeroPadding2D, ZeroPadding3D:填零
► Pooling (池化) layers: 池化是一種彙整特徵的功能,主以降低維度,池化功能的層有
  • MaxPooling1D, 2D, 3D: 對input進行1D, 2D, 3D的取最大池化.
  • AveragePooling1D, 2D, 3D:對input進行1D, 2D, 3D的平均池化
  • GlobalMaxPooling1D, 2D:整體最大池化
  • GlobalAveragePoolingd1D, 2D:整體平均池化
►  locally-connected layers: 
  • LocallyConnected1D, 2D:全連接,對輸入進行連接至輸出,權重不共用。
►  recurrent (遞迴)layers:: 
  • SimpleRNN:全連接的RNN網路
  • GRU:gated recurrent unit network
  • LSTM: long short-term memory network.
🔶 Example of Sequential API 下列是用以建立Sequential model的程式片段
model = Sequential()
model.add(Dense(10, input_shape=(256,))
model.add(Activation('tanh'))
model.add(Dense(10))
model.add(Activation('softmax'))
🔶 Example of Functional API 下列是用以建立 Functional model的程式片段
input = Input(shape=(64,))
hidden = Dense(10)(inputs)
hidden = Activation('tanh')(hidden)
hidden = Dense(10)(hidden)
output = Activation('tanh')(hidden)
model = Model(inputs=input, outputs=output)
上列程式用變數hidden 重複將新的串接在舊的之後。

🔶 Compiling the Keras model 建好model後必需再經 model.compile()才能用於訓練及預測,語法是
compile(optimizer, loss, metrics=None, sample_weight_mode=None)
Optimizer: 可使用自定義的或是內建的,如SGD, RMSprop, Adagrad, Adadelta, Adam
Loss:可使用自定義的或是內建的,如
   mean_squared_error, mean_absolute_error
   mean_absolute_pecentage_error
   mean_squared_logarithmic_error
   squared_hinge, hinge
   categorical_hinge, sparse_categorical_crossentropy

🔶 Training the Keras models
  • Compile 後必需再經 model.fit() 進行訓練, 如 model.fit(x_data, y_labels)
  • fit method 有很多參數,完整如下:  
fit(self, x, y, batch_size=32, epochs=10, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0)  

🔶 Predicting with the Keras model
訓練後的模型便可用於預測或評估, 用法有model.predict()及model.evaluate(),
  • predict: predict(x, batch_size=32, verbose=0)
  • evaluate: evaluate(self, x, y, batch_size=32, verbose=1,   sample_weight=None)
🔶實例 最後我們以一個預測MINST 數字集的例子來看看keras的應用
import pandas as pd
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
from keras.datasets import mnist
%matplotlib inline
(X_train, y_train), (X_test, y_test) = mnist.load_data()
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
for i in range(1,5):
    ax1 = plt.subplot(1,4,i)
    plt.imshow(X_train[i], cmap='gray')
印出前4個數字圖形
from keras.utils.np_utils import to_categorical
batch_size = 100
n_inputs = 784
n_epochs = 10
X_train = X_train.reshape(-1, n_inputs)
X_test = X_test.reshape(-1, n_inputs)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255.0
X_test /= 255.0
y_train_cat = to_categorical(y_train)
y_test_cat = to_categorical(y_test)
print(X_train.shape)
print(X_test.shape)
print(y_train_cat[0])
#(60000, 784)
#(10000, 784)
# [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
利用one-hot把label編碼
from keras.models import Sequential
from keras.layers import Dense
import keras.backend as K
K.clear_session()
model = Sequential()
model.add(Dense(512, input_dim=n_inputs, activation='relu'))
model.add(Dense(256, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.summary()
model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])
h = model.fit(X_train, y_train_cat, batch_size=batch_size, epochs=n_epochs, verbose=2, validation_split=0.3)
plt.plot(h.history['acc'])
plt.plot(h.history['val_acc'])
plt.legend(['Training', 'Validation'])
plt.title('Accuracy')
plt.xlabel('Epochs')
summary 輸出

訓練過程中之結果

訓練和驗證最後結果
scores = model.evaluate(X_test, y_test_cat)
print('\n loss:', scores[0])
print('\n accuracy:', scores[1])
# 10000/10000 [==============================] - 0s 45us/step
# loss: 0.14297303147470353
# accuracy: 0.9749
最後看到用1000個測試集測試結果下確率是0.9749。

參考文獻
Armando Fandango, Mastering TensorFlow 1.x, Packt Publishing, 2018

沒有留言:

張貼留言