機器學習14:用 Keras 構建神經網絡

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]]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章