用 Keras 編寫你的第一我的工神經網絡(Python)—— Jinkey 翻譯

譯者:Jinkey(微信公衆號 jinkey-love)
英文原版地址:點擊跳轉python

教程概述

這裏不須要編寫太多的代碼,不過咱們將一步步慢慢地告訴你怎麼之後怎麼建立本身的模型。
教程將會涵蓋如下步驟:算法

  1. 加載數據
  2. 定義模型
  3. 編譯模型
  4. 訓練模型
  5. 評估模型
  6. 結合全部步驟在一塊兒

這個教程的前置條件:數據庫

  1. 有 python 2 或 3 的環境和編程基礎
  2. 安裝並配置好 Scipy 庫(包括 Numpy )
  3. 你安裝好 Keras 而且有一個後端(Theano or TensorFlow

建立一個新的文件,命名爲 keras_first_network.py ,而後將教程的代碼一步步複製進去。編程

1. 加載數據

每當咱們使用機器學習算法使用隨機過程(如隨機數),先設置隨機數種子是一個好的習慣。後端

這樣您就能夠運行相同的代碼一次又一次,獲得相同的結果。若是你須要證實結果,使用隨機數據比較算法或調試代碼,這是頗有用的。微信

你能夠初始化隨機數發生器及其種子,例如:網絡

from keras.models import Sequential
from keras.layers import Dense
import numpy
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)複製代碼

如今咱們能夠加載咱們的數據了。
在這個教程中,咱們將使用皮馬印第安人糖尿病數據集.這是UCI 機器學習數據庫一個標準的機器學習數據集。它描述了病人醫療記錄和他們是否在五年內發病。dom

所以,它是一個二分類問題(出現糖尿病爲1, 不然爲 0)。
全部描述病人的輸入變量都是數值。這便於直接用於須要數值輸入輸出的神經網絡, 適合咱們第一個 Keras 神經網絡。
下載數據集而且重命名爲 pima-indians-diabetes.csv 放入 python 腳本所在的目錄的 data/pima-indians-diabetes.csv機器學習

你能夠只直接使用 Numpy 庫的 loadtxt() 方法加載數據,一共 8 個輸出變量和 1 個輸出變量(最後一列)。加載以後咱們就能夠把數據分離爲 X(輸出變量)和 Y(輸出分類)分佈式

# load pima indians dataset
dataset = numpy.loadtxt("data/pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:, 0:8]
Y = dataset[:, 8]複製代碼

咱們已經初始化了咱們對的隨機數生成器來確保結果可復現, 也加載了數據。咱們如今能夠準備定義咱們的神經網絡模型了。

2. 定義模型

Keras 中的模型被定義爲一系列的層。

咱們實例化一個 Sequential 模型對象,每次添加一層知道咱們對網絡的拓撲結構滿意。

第一件事情咱們須要確保的是輸出神經元的數量。這能夠在模型建立的時候設置參數 input_dim 來定義,咱們將這個參數設置爲 8 對應 8 個輸出變量。
咱們怎麼知道層的數量和他們的類型呢?

這是一個很是難回答的問題。這是啓發式的,咱們經過不斷地試錯找出最好的網絡結構、通常來講,你須要足夠大的網絡去明白結構對於問題是否有用。
在這個例子中, 咱們使用三層全鏈接的結構。

全鏈接層使用 Dense 定義。咱們能夠經過第一個參數定義層的神經元數量,第二個參數 init 定義權重的初始化方法, activation 參數定義激活函數。

在這個例子中, 咱們把權重初始化成一個服從均勻分佈的小隨機數(init='uniform'),在0到0.05直接(這是 Keras 標準均勻分佈權重初始值)。另外一種傳統的選擇是‘normal’,會從高斯分佈(正態分佈)中產生一個小的隨機數。

咱們在前兩層使用 (relu)[en.wikipedia.org/wiki/Rectif…)] 激活函數, 在輸出層使用 Sigmoid 函數。曾經 Sigmoidtanh 激活函數是全部的層首選的。但時至今日, 使用 relu 激活函數能夠達到更好的性能。咱們在輸出層使用 Sigmoid 函數來確保網絡輸出在 0 和 1 之間,

咱們能夠添加每一層將這些東西放到一塊兒。第一層有 12 個神經元、8個輸出變量。第二層有 8 個神經元和最後 1 個神經元的輸出層用於預測類別(糖尿病有無發病)

# create model
model = Sequential()
model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))複製代碼

3. 編譯模型

如今咱們定義好模型, 那麼就能夠編譯他了。

編譯使用高效的數學庫, 封裝了 Theano 或者 TensorFlow(稱爲 backend)。後端(backend)在你的硬件上自動選擇最好的方式去表現用於訓練和預測的神經網絡,好比 CPU、GPU 或者分佈式。

編譯時, 咱們須要額外定義訓練網絡所須要的參數。記住, 訓練網絡意味着尋找最優的權重集去預測。

咱們須要定義評估權重集的損失函數, 用於尋找不一樣權重的優化器以及咱們但願在訓練過程呈現的可選指標。

在這個例子中, 咱們使用對數損失函數(logarithmic loss), 對於二分類問題, 其在 Keras 中稱爲「binary_crossentropy」。咱們還將使用梯度降低算法‘adam’, 沒有爲何, 它就是一種高效地默認方法。想了解更多這種算法能夠查看論文: (Adam: A Method for Stochastic Optimization)[arxiv.org/abs/1412.69…]

最後, 覺得這是一個分類問題, 因此咱們會收集和彙報分類的準確率做爲度量指標。

# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])複製代碼

4. 訓練模型

咱們已經定義和編譯了模型, 他是爲高效地計算而準備的。

如今是時候在數據上訓練模型了。

咱們能夠在加載的數據上訓練和擬合模型,經過 fit() 函數。

訓練過程會在數據集迭代必定的次數,成爲 epochs, 這個能夠經過 nb_epoch 參數來設定。咱們也能夠設定 batch_size 參數來指定進行梯度降低時每一個batch包含的樣本數。訓練時一個batch的樣本會被計算一次梯度降低, 使目標函數優化一步。在這個例子中, 咱們將迭代150次、批處理大小爲10。再說一次, 這些參數能夠經過試錯來選擇。

# Fit the model
model.fit(X, Y, nb_epoch=150, batch_size=10)複製代碼

這就是在你的 CPU 或者 GPU 上發生的事情。

5. 評估模型

咱們已經在整個數據集上訓練了咱們的神經網絡, 咱們能夠在線通的數據集上評估神經網絡的性能。

這隻會告訴咱們模型有多適合已有的數據(訓練的準確率),但咱們無從知道算法在新數據上的性能。

咱們能夠簡單但很理想地把數據分爲訓練集和測試集來分別訓練和評估模型。

你能夠經過 evaluate() 函數在訓練集評估你的模型, 使用你訓練模型時相同的輸出和輸出。

這會針對每個輸出-輸出產生預測而且收集分數,包括平均損失和其餘咱們定義的指標,好比準確率。

# evaluate the model
scores = model.evaluate(X, Y)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))複製代碼

6. 將這些放在一塊兒

你已經看到用 Keras 建立你的第一個神經網絡有多麼簡單、

運行以上的代碼, 將會看到150個迭代中, 每次迭代的損失和準確率,以及最終的模型在訓練集上的評估結果, 在個人 CPU 上耗時 10s(使用 Theano 做爲後端)

...
Epoch 143/150
768/768 [==============================] - 0s - loss: 0.4614 - acc: 0.7878
Epoch 144/150
768/768 [==============================] - 0s - loss: 0.4508 - acc: 0.7969
Epoch 145/150
768/768 [==============================] - 0s - loss: 0.4580 - acc: 0.7747
Epoch 146/150
768/768 [==============================] - 0s - loss: 0.4627 - acc: 0.7812
Epoch 147/150
768/768 [==============================] - 0s - loss: 0.4531 - acc: 0.7943
Epoch 148/150
768/768 [==============================] - 0s - loss: 0.4656 - acc: 0.7734
Epoch 149/150
768/768 [==============================] - 0s - loss: 0.4566 - acc: 0.7839
Epoch 150/150
768/768 [==============================] - 0s - loss: 0.4593 - acc: 0.7839
768/768 [==============================] - 0s
acc: 79.56%

若是你嘗試在 IPython 或者 Jupyter , 你將會獲得錯誤。緣由是在訓練期間輸出進度條。你能夠關閉這個, 經過讓 model.fit() 的參數 verbose=0

福利: 作出預測

我被問得最多的一個問題是:

在我訓練模型以後, 怎麼預測新數據的分類?

這是個好問題。

咱們擬合了上述例子, 用他來在訓練集上做出預測, 僞裝咱們以前沒看到過這些數據。

作預測一樣很是簡單, 只須要使用 model.predict()。咱們在輸出層使用 Sigmoid 激活函數, 所以咱們的預測值將會在 0 到 1 的區間內。在這個分類任務中,咱們能夠輕易地經過四捨五入轉換爲離散二分類。

預測訓練集中每個記錄的完整例子以下:

# Create first network with Keras
from keras.models import Sequential
from keras.layers import Dense
import numpy
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X, Y, nb_epoch=150, batch_size=10,  verbose=2)
# calculate predictions
predictions = model.predict(X)
# round predictions
rounded = [round(x) for x in predictions]
print(rounded)複製代碼

運行這個修改過的例子, 將會打印出每一個輸出的預測值。若是有須要的話, 咱們能夠直接使用這些預測。

[1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0]

總結

在這篇文章當中, 咱們學會了如何經過 Keras 建立本身的第一個神經網絡模型。

特別是咱們學會了 使用 Keras 來建立神經網絡或深度學習模型時關鍵的 5 個步驟:

  1. 加載數據
  2. 定義模型
  3. 編譯模型
  4. 訓練模型
  5. 評估模型

有任何疑問歡迎關注個人公衆號 jinkey-love 和我交流。

相關文章
相關標籤/搜索