Keras
是一個功能強大且易於使用的免費開源 Python 庫,用於開發和評估
深度學習模型
。
它封裝了高效的數值計算庫Theano和TensorFlow,讓您只需幾行程式碼即可定義和訓練神經網路模型。
在本教程中,您將瞭解如何使用 Keras 在 Python 中建立您的第一個深度學習神經網路模型。
Keras 教程概述
不需要很多程式碼,但我們會慢慢地跨過它,以便您將來知道如何建立自己的模型。
您將在本教程中介紹的步驟如下:
載入資料。
定義 Keras 模型。
編譯 Keras 模型。
適合 Keras 模型。
評估 Keras 模型。
把這一切聯絡在一起。
作出預測
這個 Keras 教程有一些要求:
您已經安裝並配置了 Python 2 或 3。
您已經安裝並配置了 SciPy(包括 NumPy)。
您已經安裝並配置了 Keras 和後端(Theano 或 TensorFlow)。
如果您需要環境方面的幫助,請參閱教程:
如何為深度學習設定 Python 環境
建立一個名為
keras_first_network.py
的新檔案,並在執行過程中鍵入或複製並貼上程式碼到該檔案中。
1。載入資料
第一步是定義我們打算在本教程中使用的函式和類。
我們將使用NumPy 庫載入我們的資料集,我們將使用Keras 庫中的兩個類來定義我們的模型。
下面列出了所需的import匯入包。
# first neural network with keras tutorial
from numpy import loadtxtfrom keras。models
import Sequentialfrom keras。layers import Dense。。。
我們現在可以載入我們的資料集。
在本 Keras 教程中,我們將使用皮馬印第安人糖尿病發病資料集。這是來自 UCI 機器學習儲存庫的標準機器學習資料集。它描述了皮馬印第安人的患者病歷資料,以及他們是否在五年內患上糖尿病。
因此,這是一個二元分類問題(糖尿病的發病為 1 或不為 0)。描述每個患者的所有輸入變數都是數字變數。這使得它很容易直接與需要數值輸入和輸出值的神經網路一起使用,並且非常適合我們在 Keras 中的第一個神經網路。
資料集可從這裡獲得:
資料集 CSV 檔案 (pima-indians-diabetes。csv)
資料集詳情
下載資料集並將其放在本地工作目錄中,與 python 檔案的位置相同。
用檔名儲存它:
pima-indians-diabetes。csv
檢視檔案內部,您應該會看到如下所示的資料行:
6,148,72,35,0,33。6,0。627,50,11,85,66,29,0,26。6,0。351,31,08,183,64,0,0,23。3,0。672,32,11,89,66,23,94,28。1,0。167,21,00,137,40,35,168,43。1,2。288,33,1。。。
我們現在可以使用 NumPy 函式loadtxt()將檔案載入為數字矩陣。
有八個輸入變數和一個輸出變數(最後一列)。我們將學習一個模型,將輸入變數 (X) 的行對映到輸出變數 (y),我們通常將其總結為
y = f(X)
。
這些變數可以總結如下:
輸入變數 (X):
懷孕次數
口服葡萄糖耐量試驗中 2 小時的血漿葡萄糖濃度
舒張壓 (mm Hg)
三頭肌皮褶厚度(mm)
2 小時血清胰島素 (mu U/ml)
體重指數(體重公斤/(身高米)^2)
糖尿病譜系函式
年齡(歲)
輸出變數 (y):
類變數(0 或 1)
一旦將 CSV 檔案載入到記憶體中,我們就可以將資料列拆分為輸入和輸出變數。
資料將儲存在二維陣列中,其中第一個維度是行,第二個維度是列,例如 [行,列]。
我們可以透過使用標準 NumPy切片運算子或“:”選擇列的子集將陣列拆分為兩個陣列,我們可以透過切片 0:8 選擇從索引 0 到索引 7 的前 8 列。然後我們可以透過索引 8 選擇輸出列(第 9 個變數)。
。。。# load the datasetdataset = loadtxt(‘pima-indians-diabetes。csv’, delimiter=‘,’)# split into input (X) and output (y) variablesX = dataset[:,0:8]y = dataset[:,8]。。。
我們現在準備定義我們的神經網路模型。
注意
,資料集有 9 列,範圍 0:8 將選擇從 0 到 7 的列,在索引 8 之前停止。如果這對您來說是新的,那麼您可以在這篇文章中瞭解有關陣列切片和範圍的更多資訊:
如何在 Python 中為機器學習索引、切片和重塑 NumPy 陣列
2。 定義 Keras 模型
Keras 中的模型被定義為一系列層。
我們建立了一個
Sequential 模型
並一次新增一層,直到我們對我們的網路架構感到滿意為止。
正確的第一件事是確保輸入層具有正確數量的輸入特徵。這可以在使用
input_dim
引數建立第一層並將其設定為 8 的 8 個輸入變數時指定。
我們如何知道層的數量及其型別?
這是一個非常難的問題。我們可以使用一些啟發式方法,通常最好的網路結構是透過反覆試驗的過程找到的(我在此處對此進行了更多解釋)。通常,您需要一個足夠大的網路來捕獲問題的結構。
在這個例子中,我們將使用一個具有三層的全連線網路結構。
全連線層使用Dense 類定義。我們可以指定層中神經元或節點的數量作為第一個引數,並使用
activation
引數指定啟用函式。
我們將在前兩層使用稱為 ReLU的整流線性單元啟用函式,在輸出層使用 Sigmoid 函式。
過去,所有層都首選 Sigmoid 和 Tanh 啟用函式。現在,使用 ReLU 啟用函式可以獲得更好的效能。我們在輸出層使用 sigmoid 以確保我們的網路輸出介於 0 和 1 之間,並且可以輕鬆對映到類別 1 的機率或使用預設閾值 0。5 捕捉到任一類別的硬分類。
我們可以透過新增每一層將它們拼湊在一起:
該模型需要具有 8 個變數的資料行(
input_dim=8
引數)
第一個隱藏層有 12 個節點,使用 relu 啟用函式。
第二個隱藏層有8個節點,使用relu啟用函式。
輸出層有一個節點,使用sigmoid啟用函式。
。。。# define the keras modelmodel = Sequential()model。add(Dense(12, input_dim=8, activation=‘relu’))model。add(Dense(8, activation=‘relu’))model。add(Dense(1, activation=‘sigmoid’))。。。
注意
,這裡最令人困惑的是模型輸入的形狀被定義為第一個隱藏層的引數。這意味著新增第一個 Dense 層的程式碼行做了兩件事,定義輸入或可見層和第一個隱藏層。
3。編譯Keras模型
現在模型已定義,
我們可以編譯它
。
編譯模型使用了有效的數字庫(所謂的後端),例如 Theano 或 TensorFlow。後端會自動選擇表示網路的最佳方式,用於訓練和預測以在您的硬體(例如 CPU 或 GPU 甚至分散式)上執行。
編譯時,我們必須指定訓練網路時所需的一些附加屬性。請記住,訓練網路意味著找到最佳權重集以將輸入對映到我們資料集中的輸出。
我們必須指定用於評估一組權重的損失函式,最佳化器用於搜尋網路的不同權重以及我們希望在訓練期間收集和報告的任何可選指標。
在這種情況下,我們將使用交叉熵作為
損失
引數。這種損失是針對二元分類問題的,在 Keras 中被定義為“
binary_crossentropy
”。您可以在此處瞭解有關根據您的問題選擇損失函式的更多資訊:
訓練深度學習神經網路時如何選擇損失函式
我們將
最佳化器
定義為高效的隨機梯度下降演算法“
adam
”。這是梯度下降的流行版本,因為它會自動調整自身並在廣泛的問題中給出良好的結果。要了解有關 Adam 版本的隨機梯度下降的更多資訊,請參閱帖子:
深度學習的 Adam 最佳化演算法簡介
最後,因為這是一個分類問題,我們將收集並報告透過
度量
引數定義的分類準確度。
。。。# compile the keras modelmodel。compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])。。。
4。 擬合 Keras 模型
我們已經定義了我們的模型並編譯它準備進行高效計算。
現在是對一些資料執行模型的時候了。
我們可以透過呼叫模型上的
fit()
函式在載入的資料上訓練或擬合模型。
訓練發生在 epoch 上,每個 epoch 被分成批次。
Epoch
:一次遍歷訓練資料集中的所有行。
Batch
:在更新權重之前,模型在一個時期內考慮的一個或多個樣本。
一個時期由一個或多個批次組成,基於所選的批次大小,並且該模型適用於多個時期。有關 epochs 和 batches 之間差異的更多資訊,請參閱帖子:
神經網路中的批處理和紀元有什麼區別?
訓練過程將透過稱為 epochs 的資料集執行固定次數的迭代,我們必須使用
epochs
引數指定。我們還必須設定在每個時期內更新模型權重之前考慮的資料集行數,稱為批大小,並使用
batch_size
引數進行設定。
對於這個問題,我們將執行少量時期(150)並使用相對較小的批次大小 10。
這些配置可以透過反覆試驗透過實驗來選擇。我們希望對模型進行足夠的訓練,以便它學習到輸入資料行到輸出分類的良好(或足夠好)對映。模型總會有一些錯誤,但對於給定的模型配置,錯誤量會在某個時間點後趨於平穩。這稱為模型收斂。
。。。# fit the keras model on the datasetmodel。fit(X, y, epochs=150, batch_size=10)。。。
這是在您的 CPU 或 GPU 上進行工作的地方。
此示例不需要 GPU,但如果您對如何在雲中廉價地在 GPU 硬體上執行大型模型感興趣,請參閱此帖子:
如何設定 Amazon AWS EC2 GPU 來訓練 Keras 深度學習模型
5。 評估 Keras 模型
我們已經在整個資料集上訓練了我們的神經網路,我們可以在同一資料集上評估網路的效能。
這隻會讓我們瞭解我們對資料集建模的程度(例如訓練準確性),但不知道演算法在新資料上的表現如何。我們這樣做是為了簡單起見,但理想情況下,您可以將資料分成訓練和測試資料集,用於訓練和評估模型。
您可以使用模型上的
evaluate()
函式在訓練資料集上
評估
模型,並將用於訓練模型的相同輸入和輸出傳遞給它。
這將為每個輸入和輸出對生成預測並收集分數,包括平均損失和您配置的任何指標,例如準確性。
該
評估()
函式將返回兩個值的列表。第一個是模型在資料集上的損失,第二個是模型在資料集上的準確性。我們只對報告準確性感興趣,因此我們將忽略損失值。
。。。# evaluate the keras model_, accuracy = model。evaluate(X, y)print(‘Accuracy: %。2f’ % (accuracy*100))
6。 把它們綁在一起
您剛剛看到了如何在 Keras 中輕鬆建立您的第一個神經網路模型。
讓我們將它們組合成一個完整的程式碼示例。
# first neural network with keras tutorial
from numpy import loadtxt
from keras。models import Sequential
from keras。layers import Dense
# load the dataset
dataset = loadtxt(‘pima-indians-diabetes。csv’, delimiter=‘,’)
# split into input (X) and output (y) variables
X = dataset[:,0:8]
y = dataset[:,8]
# define the keras model
model = Sequential()
model。add(Dense(12, input_dim=8, activation=‘relu’))
model。add(Dense(8, activation=‘relu’))
model。add(Dense(1, activation=‘sigmoid’))
# compile the keras model
model。compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])
# fit the keras model on the dataset
model。fit(X, y, epochs=150, batch_size=10)
# evaluate the keras model
_, accuracy = model。evaluate(X, y)
print(‘Accuracy: %。2f’ % (accuracy*100))
您可以將所有程式碼複製到 Python 檔案中,並將其另存為“
keras_first_network.py
”,與資料檔案“
pima-indians-diabetes.csv
”位於同一目錄中。然後,您可以從命令列(命令提示符)將 Python 檔案作為指令碼執行,如下所示:
python keras_first_network。py
執行此示例,您應該看到 150 個 epoch 中的每個 epoch 列印損失和準確度的訊息,然後是在訓練資料集上對訓練模型的最終評估。
在我的 CPU 上執行的工作站上執行大約需要 10 秒。
理想情況下,我們希望損失為零,準確度為 1。0(例如 100%)。這對於最微不足道的機器學習問題是不可能的。相反,我們的模型中總會有一些錯誤。目標是選擇一個模型配置和訓練配置,以實現給定資料集的最低損失和最高準確度。
。。。768/768 [==============================] - 0s 63us/step - loss: 0。4817 - acc: 0。7708Epoch 147/150768/768 [==============================] - 0s 63us/step - loss: 0。4764 - acc: 0。7747Epoch 148/150768/768 [==============================] - 0s 63us/step - loss: 0。4737 - acc: 0。7682Epoch 149/150768/768 [==============================] - 0s 64us/step - loss: 0。4730 - acc: 0。7747Epoch 150/150768/768 [==============================] - 0s 63us/step - loss: 0。4754 - acc: 0。7799768/768 [==============================] - 0s 38us/stepAccuracy: 76。56
請注意,
如果您嘗試在 IPython 或 Jupyter 筆記本中執行此示例,您可能會收到錯誤訊息。
原因是訓練期間的輸出進度條。您可以透過在呼叫
fit()
和
evaluate()
函式時設定
verbose=0
輕鬆關閉這些功能,例如:
。。。# fit the keras model on the dataset without progress barsmodel。fit(X, y, epochs=150, batch_size=10, verbose=0)# evaluate the keras model_, accuracy = model。evaluate(X, y, verbose=0)。。。
注意
:您的結果可能會因演算法或評估程式的隨機性或數值精度的差異而有所不同。考慮多次執行該示例並比較平均結果。
你得了多少分?
在下面的評論中釋出您的結果。
神經網路是一種隨機演算法,這意味著每次執行程式碼時,相同資料上的相同演算法可以訓練具有不同技能的不同模型。這是一個功能,而不是一個錯誤。您可以在帖子中瞭解有關此內容的更多資訊:
在機器學習中擁抱隨機性
模型效能的差異意味著要獲得模型效能的合理近似值,您可能需要多次擬合併計算準確度分數的平均值。有關這種評估神經網路的方法的更多資訊,請參閱帖子:
如何評估深度學習模型的技能
例如,以下是重新執行示例 5 次的準確度分數:
Accuracy: 75。00Accuracy: 77。73Accuracy: 77。60Accuracy: 78。12Accuracy: 76。17
我們可以看到所有的準確度分數都在 77% 左右,平均值為 76。924%。
7。 做出預測
我被問到的第一個問題是:
訓練模型後,如何使用它對新資料進行預測?
很好的問題。
我們可以調整上面的例子並使用它來生成對訓練資料集的預測,假裝它是一個我們以前從未見過的新資料集。
進行預測就像在模型上呼叫
predict()
函式一樣簡單。我們在輸出層使用 sigmoid 啟用函式,因此預測將是 0 到 1 範圍內的機率。我們可以透過四捨五入輕鬆地將它們轉換為該分類任務的清晰二元預測。
例如:
。。。# make probability predictions with the modelpredictions = model。predict(X)# round predictionsrounded = [round(x[0]) for x in predictions]
或者,我們可以在模型上呼叫
predict_classes()
函式來直接預測清晰的類,例如:
。。。# make class predictions with the modelpredictions = model。predict_classes(X)
下面的完整示例對資料集中的每個示例進行預測,然後列印資料集中前 5 個示例的輸入資料、預測類別和預期類別。
# first neural network with keras make predictions
from numpy import loadtxt
from keras。models import Sequential
from keras。layers import Dense
# load the dataset
dataset = loadtxt(‘pima-indians-diabetes。csv’, delimiter=‘,’)
# split into input (X) and output (y) variables
X = dataset[:,0:8]
y = dataset[:,8]
# define the keras model
model = Sequential()
model。add(Dense(12, input_dim=8, activation=‘relu’))
model。add(Dense(8, activation=‘relu’))
model。add(Dense(1, activation=‘sigmoid’))
# compile the keras model
model。compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])
# fit the keras model on the dataset
model。fit(X, y, epochs=150, batch_size=10, verbose=0)
# make class predictions with the model
predictions = model。predict_classes(X)
# summarize the first 5 cases
for i in range(5):
print(‘%s => %d (expected %d)’ % (X[i]。tolist(), predictions[i], y[i]))
執行示例不會像以前那樣顯示進度條,因為我們將詳細引數設定為 0。
模型擬合後,對資料集中的所有示例進行預測,並列印前 5 個示例的輸入行和預測類值,並與預期類值進行比較。
我們可以看到大多數行都被正確預測。事實上,根據我們在上一節中估計的模型效能,我們預計大約 76。9% 的行會被正確預測。
[6。0, 148。0, 72。0, 35。0, 0。0, 33。6, 0。627, 50。0] => 0 (expected 1)[1。0, 85。0, 66。0, 29。0, 0。0, 26。6, 0。351, 31。0] => 0 (expected 0)[8。0, 183。0, 64。0, 0。0, 0。0, 23。3, 0。672, 32。0] => 1 (expected 1)[1。0, 89。0, 66。0, 23。0, 94。0, 28。1, 0。167, 21。0] => 0 (expected 0)[0。0, 137。0, 40。0, 35。0, 168。0, 43。1, 2。288, 33。0] => 1 (expected 1)
如果您想了解有關如何使用 Keras 模型進行預測的更多資訊,請參閱帖子:
如何使用 Keras 進行預測
Keras 教程總結
在本文中,您瞭解瞭如何使用強大的 Keras Python 庫來建立您的第一個神經網路模型以進行深度學習。
具體來說,您學習了使用 Keras 建立神經網路或深度學習模型的六個關鍵步驟,包括:
如何載入資料。
如何在 Keras 中定義神經網路。
如何使用高效的數值後端編譯 Keras 模型。
如何在資料上訓練模型。
如何在資料上評估模型。
如何使用模型進行預測。
Keras 教程擴充套件
幹得好,您已經使用 Python 中的 Keras 深度學習庫成功開發了您的第一個神經網路。
本節提供了您可能想要探索的本教程的一些擴充套件。
調整模型。
更改模型的配置或訓練過程,看看是否可以提高模型的效能,例如達到 76% 以上的準確率。
儲存模型
。更新教程以將模型儲存到檔案,然後稍後載入並使用它進行預測(請參閱本教程)。
總結模型
。更新教程以總結模型並建立模型層圖(請參閱本教程)。
單獨的訓練和測試資料集
。將載入的資料集拆分為訓練集和測試集(基於行拆分),並使用一組來訓練模型,另一組來估計模型在新資料上的效能。
繪製學習曲線
。fit() 函式返回一個歷史物件,該物件總結了每個 epoch 結束時的損失和準確度。建立此資料的線圖,稱為學習曲線(請參閱本教程)。
學習一個新的資料集
。更新教程以使用不同的表格資料集,可能來自UCI 機器學習儲存庫。
使用函式式 API
。更新教程以使用 Keras Functional API 來定義模型(請參閱本教程)。
版權宣告:文章來自公眾號(python風控模型),未經許可,不得抄襲。遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。