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

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

使用 Keras 建立、評價深度神經網絡很是的便捷,不過你須要嚴格地遵循幾個步驟來構建模型。html

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

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

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

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

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

題圖版權由 Martin Stitchener 全部。ios

綜述

下面歸納一下咱們將要介紹的在 Keras 中構建神經網絡模型的 5 個步驟。git

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

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

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

想要了解更多使用 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前端後端產品設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索