Keras 中構建神經網路的 5 個步驟

lsvih發表於2017-10-16

Keras 中構建神經網路的 5 個步驟

使用 Keras 建立、評價深度神經網路非常的便捷,不過你需要嚴格地遵循幾個步驟來構建模型。

在本文中我們將一步步地探索在 Keras 中建立、訓練、評價深度神經網路,並瞭解如何使用訓練好的模型進行預測。

在閱讀完本文後你將瞭解:

  • 如何在 Keras 中定義、編譯、訓練以及評價一個深度神經網路。
  • 如何選擇、使用預設的模型解決迴歸、分類預測問題。
  • 如何使用 Keras 開發並執行你的第一個多層感知機網路。

  • 2017 年 3 月更新:將示例更新至 Keras 2.0.2 / TensorFlow 1.0.1 / Theano 0.9.0。

Keras 中構建神經網路的 5 個步驟
Keras 中構建神經網路的 5 個步驟

題圖版權由 Martin Stitchener 所有。

綜述

下面概括一下我們將要介紹的在 Keras 中構建神經網路模型的 5 個步驟。

  1. 定義網路。
  2. 編譯網路。
  3. 訓練網路。
  4. 評價網路。
  5. 進行預測。

Keras 中構建神經網路的 5 個步驟
Keras 中構建神經網路的 5 個步驟

Keras 中構建神經網路的 5 個步驟

想要了解更多使用 Python 進行深度學習的知識?

免費訂閱 2 周,收取我的郵件,探索 MLP、CNN 以及 LSTM 吧!(附帶樣例程式碼)

現在點選註冊還能得到免費的 PDF 版教程。

點選這裡開始你的小課程吧!

第一步:定義網路

首先要做的就是定義你的神經網路。

在 Keras 中,可以通過一系列的層來定義神經網路。這些層的容器就是 Sequential 類。(譯註:序貫模型)

第一步要做的就是建立 Sequential 類的例項。然後你就可以按照層的連線順序建立你所需要的網路層了。

例如,我們可以做如下兩步:

model = Sequential()
model.add(Dense(2))複製程式碼

此外,我們也可以通過建立一個層的陣列,並將其傳給 Sequential 構造器來定義模型。

layers = [Dense(2)]
model = Sequential(layers)複製程式碼

網路的第一層必須要定義預期輸入維數。指定這個引數的方式有許多種,取決於要建造的模型種類,不過在本文的多層感知機模型中我們將通過 input_dim 屬性來指定它。

例如,我們要定義一個小型的多層感知機模型,這個模型在可見層中具有 2 個輸入,在隱藏層中有 5 個神經元,在輸出層中有 1 個神經元。這個模型可以定義如下:

model = Sequential()
model.add(Dense(5, input_dim=2))
model.add(Dense(1))複製程式碼

你可以將這個序貫模型看成一個管道,從一頭喂入資料,從另一頭得到預測。

這種將通常互相連線的層分開,並作為單獨的層加入模型是 Keras 中一個非常有用的概念,這樣可以清晰地表明各層在資料從輸入到輸出的轉換過程中起到的職責。例如,可以將用於將各個神經元中訊號求和、轉換的啟用函式單獨提取出來,並將這個 Activation 物件同層一樣加入 Sequential 模型中。

model = Sequential()
model.add(Dense(5, input_dim=2))
model.add(Activation('relu'))
model.add(Dense(1))
model.add(Activation('sigmoid'))複製程式碼

輸出層啟用函式的選擇尤為重要,它決定了預測值的格式。

例如,以下是一些常用的預測建模問題型別,以及它們可以在輸出層使用的結構和標準的啟用函式:

  • 迴歸問題:使用線性的啟用函式 “linear”,並使用與與輸出數量相匹配的神經元數量。
  • 二分類問題:使用邏輯啟用函式 “sigmoid”,在輸出層僅設一個神經元。
  • 多分類問題:使用 Softmax 啟用函式 “softmax”;假如你使用的是 one-hot 編碼的輸出格式的話,那麼每個輸出對應一個神經元。

第二步:編譯網路

當我們定義好網路之後,必須要對它進行編譯。

編譯是一個高效的步驟。它會將我們定義的層序列通過一系列高效的矩陣轉換,根據 Keras 的配置轉換成能在 GPU 或 CPU 上執行的格式。

你可以將編譯過程看成是對你網路的預計算。

無論是要使用優化器方案進行訓練,還是從儲存的檔案中載入一組預訓練權重,只要是在定義模型之後都需要編譯,因為編譯步驟會將你的網路轉換為適用於你的硬體的高效結構。此外,進行預測也是如此。

編譯步驟需要專門針對你的網路的訓練設定一些引數,設定訓練網路使用的優化演算法 以及用於評價網路通過優化演算法最小化結果的損失函式尤為重要。

下面的例子對定義好的用於迴歸問題的模型進行編譯時,指定了隨機梯度下降(sgd)優化演算法,以及均方差(mse)算是函式。

model.compile(optimizer='sgd', loss='mse')複製程式碼

預測建模問題的種類也會限制可以使用的損失函式型別。

例如,下面是幾種不同的預測建模型別對應的標準損失函式:

  • 迴歸問題:均方差誤差 “mse”。
  • 二分類問題:對數損失(也稱為交叉熵)“_binarycrossentropy”。
  • 多分類問題:多類對數損失 “_categoricalcrossentropy”。

你可以查閱 Keras 支援的損失函式

最常用的優化演算法是隨機梯度下降,不過 Keras 也支援其它的一些優化演算法

以下幾種優化演算法可能是最常用的優化演算法,因為它們的效能一般都很好:

  • 隨機梯度下降sgd” 需要對學習率以及動量引數進行調參。
  • ADAMadam” 需要對學習率進行調參。
  • RMSproprmsprop” 需要對學習率進行調參。

最後,你還可以指定在訓練模型過程中除了損失函式值之外的特定指標。一般對於分類問題來說,最常收集的指標就是準確率。需要收集的指標由設定陣列中的名稱決定。

例如:

model.compile(optimizer='sgd', loss='mse', metrics=['accuracy'])複製程式碼

第三步:訓練網路

在網路編譯完成後,就能對它進行訓練了。這個過程也可以看成是調整權重以擬合訓練資料集。

訓練網路需要制定訓練資料,包括輸入矩陣 X 以及相對應的輸出 y。

在此步驟,將使用反向傳播演算法對網路進行訓練,並使用在編譯時制定的優化演算法以及損失函式來進行優化。

反向傳播演算法需要指定訓練的 Epoch(回合數、曆元數)、對資料集的 exposure 數。

每個 epoch 都可以被劃分成多組資料輸入輸出對,它們也稱為 batch(批次大小)。batch 設定的數字將會定義在每個 epoch 中更新權重之前輸入輸出對的數量。這種做法也是一種優化效率的方式,可以確保不會同時載入過多的輸入輸出對到記憶體(視訊記憶體)中。

以下是一個最簡單的訓練網路的例子:

model.compile(optimizer='sgd', loss='mse', metrics=['accuracy'])複製程式碼

在訓練網路之後,會返回一個歷史物件(History oject),其中包括了模型在訓練中各項效能的摘要(包括每輪的損失函式值及在編譯時制定收集的指標)。

第四步:評價網路

在網路訓練完畢之後,就可以對其進行評價。

可以使用訓練集的資料對網路進行評價,但這種做法得到的指標對於將網路進行預測並沒有什麼用。因為在訓練時網路已經“看”到了這些資料。

因此我們可以使用之前沒有“看”到的額外資料集來評估網路效能。這將提供網路在未來對沒有見過的資料進行預測的效能時的估測。

評價模型將會評價所有測試集中的輸入輸出對的損失值,以及在模型編譯時指定的其它指標(例如分類準確率)。本步驟將返回一組評價指標結果。

例如,一個在編譯時使用準確率作為指標的模型可以在新資料集上進行評價,如下所示:

loss, accuracy = model.evaluate(X, y)複製程式碼

第五步:進行預測

最後,如果我們對訓練後的模型的效能滿意的話,就能用它來對新的資料做預測了。

這一步非常簡單,直接在模型上呼叫 predict() 函式,傳入一組新的輸入即可。

例如:

predictions = model.predict(x)複製程式碼

預測值將以網路輸出層定義的格式返回。

在迴歸問題中,這些由線性啟用函式得到的預測值可能直接就符合問題需要的格式。

對於二分類問題,預測值可能是一組概率值,這些概率說明了資料分到第一類的可能性。可以通過四捨五入(K.round)將這些概率值轉換成 0 與 1。

而對於多分類問題,得到的結果可能也是一組概率值(假設輸出變數用的是 one-hot 編碼方式),因此它還需要用 argmax 函式將這些概率陣列轉換為所需要的單一類輸出。

End-to-End Worked Example

讓我們用一個小例子將以上的所有內容結合起來。

我們將以 Pima Indians 糖尿病發病二分類問題為例。你可以在 UCI 機器學習倉庫中下載此資料集。

該問題有 8 個輸入變數,需要輸出 0 或 1 的分類值。

我們將構建一個包含 8 個輸入的可見層、12 個神經元的隱藏層、rectifier 啟用函式、1 個神經元的輸出層、sigmoid 啟用函式的多層感知機神經網路。

我們將對網路進行 100 epoch 次訓練,batch 大小設為 10,使用 ADAM 優化演算法以及對數損失函式。

在訓練之後,我們使用訓練資料對模型進行評價,然後使用訓練資料對模型進行單獨的預測。這麼做是為了方便起見,一般來說我們都會使用額外的測試資料集進行評價,用新的資料進行預測。

完整程式碼如下:

# Keras 多層感知機神經網路樣例
from keras.models import Sequential
from keras.layers import Dense
import numpy
# 載入資料
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
X = dataset[:,0:8]
Y = dataset[:,8]
# 1. 定義網路
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# 2. 編譯網路
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 3. 訓練網路
history = model.fit(X, Y, epochs=100, batch_size=10)
# 4. 評價網路
loss, accuracy = model.evaluate(X, Y)
print("\nLoss: %.2f, Accuracy: %.2f%%" % (loss, accuracy*100))
# 5. 進行預測
probabilities = model.predict(X)
predictions = [float(round(x)) for x in probabilities]
accuracy = numpy.mean(predictions == Y)
print("Prediction Accuracy: %.2f%%" % (accuracy*100))複製程式碼

執行樣例,會得到以下輸出:

...
768/768 [==============================] - 0s - loss: 0.5219 - acc: 0.7591
Epoch 99/100
768/768 [==============================] - 0s - loss: 0.5250 - acc: 0.7474
Epoch 100/100
768/768 [==============================] - 0s - loss: 0.5416 - acc: 0.7331
32/768 [>.............................] - ETA: 0s
Loss: 0.51, Accuracy: 74.87%
Prediction Accuracy: 74.87%複製程式碼

總結

在本文中,我們探索了使用 Keras 庫進行深度學習時構建神經網路的 5 個步驟。

此外,你還學到了:

  • 如何在 Keras 中定義、編譯、訓練以及評價一個深度神經網路。
  • 如何選擇、使用預設的模型解決迴歸、分類預測問題。
  • 如何使用 Keras 開發並執行你的第一個多層感知機網路。

你對 Keras 的神經網路模型還有別的問題嗎?或者你對本文還有什麼建議嗎?請在評論中留言,我會盡力回答。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOSReact前端後端產品設計 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章