Keras官網: https://keras.io/
Keras is a high-level neural networks API, written in Python and capable of running on top of TensorFlow, CNTK, or Theano.
手寫神經網絡是很繁雜的,就算用tensorflow等框架,也需要手動計算很多參數;
Keras可以封裝TensorFlow的所有接口,可以更方便,更抽象的設計神經網絡工程;
Keras 使神經網絡的編寫過程更簡單。爲了展示有多簡單,將用幾行代碼構建一個完全連接的簡單網絡。
要使用 Keras,你需要知道以下幾個核心概念。
1.序列模型
keras.models.Sequential 類是神經網絡模型的封裝容器。它會提供常見的函數,例如 fit()、evaluate() 和 compile()。
from keras.models import Sequential
#Create the Sequential model
model = Sequential()
2.層
Keras 層就像神經網絡層。有全連接層、最大池化層和激活層。你可以使用模型的 add() 函數添加層。例如,簡單的模型可以如下所示:
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Flatten
#創建序列模型
model = Sequential()
#第一層 - 添加有128個節點的全連接層以及32個節點的輸入層
model.add(Dense(128, input_dim=32))
#第二層 - 添加 softmax 激活層
model.add(Activation('softmax'))
#第三層 - 添加全連接層
model.add(Dense(10))
#第四層 - 添加 Sigmoid 激活層
model.add(Activation('sigmoid'))
Keras 將根據第一層自動推斷後續所有層的形狀。這意味着,你只需爲第一層設置輸入維度。
上面的第一層 model.add(Dense(input_dim=32)) 將維度設爲 32(表示數據來自 32 維空間)。第二層級獲取第一層級的輸出,並將輸出維度設爲 128 個節點。這種將輸出傳遞給下一層級的鏈繼續下去,直到最後一個層級(即模型的輸出)。可以看出輸出維度是 10。
構建好模型後,我們就可以用以下命令對其進行編譯。我們將損失函數指定爲我們一直處理的 categorical_crossentropy。我們還可以指定優化程序,稍後我們將瞭解這一概念,暫時將使用 adam。最後,我們可以指定評估模型用到的指標。我們將使用準確率。
3.編譯模型
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics = ['accuracy'])
4.查看模型架構:
model.summary()
Model: "sequential_10"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_13 (Dense) (None, 128) 4224
_________________________________________________________________
activation_11 (Activation) (None, 128) 0
_________________________________________________________________
dense_14 (Dense) (None, 10) 1290
_________________________________________________________________
activation_12 (Activation) (None, 10) 0
=================================================================
Total params: 5,514
Trainable params: 5,514
Non-trainable params: 0
_________________________________________________________________
然後使用以下命令對其進行擬合,指定 epoch 次數和我們希望在屏幕上顯示的信息詳細程度。
然後使用fit命令訓練模型並通過 epoch 參數來指定訓練輪數(週期),每 epoch 完成對整數據集的一次遍歷。 verbose 參數可以指定顯示訓練過程信息類型,這裏定義爲 0 表示不顯示信息。
5.擬合模型
model.fit(X, y, nb_epoch=1000, verbose=0)
注意:在 Keras 1 中,nb_epoch 會設置 epoch 次數,但是在 Keras 2 中,變成了 epochs。
6.評估模型
最後,我們可以使用以下命令來評估模型:
model.evaluate()
練習
我們從最簡單的示例開始。構建一個簡單的多層前向反饋神經網絡以解決 XOR 問題。
將第一層設爲 Dense() 層,並將節點數設爲8,且 input_dim 設爲 2。
在第二層之後使用 softmax 激活函數。
將輸出層節點設爲 2,因爲輸出只有 2 個類別。
在輸出層之後使用 softmax 激活函數。
對模型運行 10 個 epoch。
import numpy as np
from keras.utils import np_utils
import tensorflow as tf
# Using TensorFlow 1.0.0; use tf.python_io in later versions
#tf.python.control_flow_ops = tf
# Set random seed
np.random.seed(42)
# Our data
X = np.array([[0,0],[0,1],[1,0],[1,1]]).astype('float32')
y = np.array([[0],[1],[1],[0]]).astype('float32')
# Initial Setup for Keras
from keras.models import Sequential
from keras.layers.core import Dense, Activation
# One-hot encoding the output
y = np_utils.to_categorical(y)
# Building the model
xor = Sequential()
# Add required layers
xor.add(Dense(64, input_dim=2))
xor.add(Dense(8))
xor.add(Activation("relu"))
xor.add(Dense(2))
xor.add(Activation("softmax"))
# Specify loss as "binary_crossentropy", optimizer as "adam",
# and add the accuracy metric
xor.compile(loss="binary_crossentropy", optimizer="adam", metrics = ['accuracy'])
# Uncomment this line to print the model architecture
xor.summary()
# Fitting the model
history = xor.fit(X, y, nb_epoch=100, verbose=0)
# Scoring the model
score = xor.evaluate(X, y)
print("\nAccuracy: ", score[-1])
# Checking the predictions
print("\nPredictions:")
print(xor.predict_proba(X))
Model: "sequential_7"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_8 (Dense) (None, 64) 192
_________________________________________________________________
dense_9 (Dense) (None, 8) 520
_________________________________________________________________
activation_7 (Activation) (None, 8) 0
_________________________________________________________________
dense_10 (Dense) (None, 2) 18
_________________________________________________________________
activation_8 (Activation) (None, 2) 0
=================================================================
Total params: 730
Trainable params: 730
Non-trainable params: 0
_________________________________________________________________
/home/leon/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:40: UserWarning: The `nb_epoch` argument in `fit` has been renamed `epochs`.
4/4 [==============================] - 0s 6ms/step
Accuracy: 1.0
Predictions:
[[0.79214245 0.20785749]
[0.15228593 0.84771407]
[0.19008899 0.809911 ]
[0.7188974 0.28110263]]