最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Keras 開發(fā)你的第一個 Python 深度學(xué)習(xí)項目

2021-10-10 12:25 作者:python風(fēng)控模型  | 我要投稿

Keras是一個功能強(qiáng)大且易于使用的免費(fèi)開源 Python 庫,用于開發(fā)和評估深度學(xué)習(xí)模型。

它封裝了高效的數(shù)值計算庫Theano和TensorFlow,讓您只需幾行代碼即可定義和訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型。

在本教程中,您將了解如何使用 Keras 在 Python 中創(chuàng)建您的第一個深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)模型。

Keras 教程概述

不需要很多代碼,但我們會慢慢地跨過它,以便您將來知道如何創(chuàng)建自己的模型。

您將在本教程中介紹的步驟如下:

  1. 加載數(shù)據(jù)。

  2. 定義 Keras 模型。

  3. 編譯 Keras 模型。

  4. 適合 Keras 模型。

  5. 評估 Keras 模型。

  6. 把這一切聯(lián)系在一起。

  7. 作出預(yù)測

這個 Keras 教程有一些要求:

  1. 您已經(jīng)安裝并配置了 Python 2 或 3。

  2. 您已經(jīng)安裝并配置了 SciPy(包括 NumPy)。

  3. 您已經(jīng)安裝并配置了 Keras 和后端(Theano 或 TensorFlow)。

如果您需要環(huán)境方面的幫助,請參閱教程:

  • 如何為深度學(xué)習(xí)設(shè)置 Python 環(huán)境

創(chuàng)建一個為keras_first_network.py的新文件,并在執(zhí)行過程中鍵入或復(fù)制并粘貼代碼到該文件中。


1.加載數(shù)據(jù)

第一步是定義我們打算在本教程中使用的函數(shù)和類。

我們將使用NumPy 庫加載我們的數(shù)據(jù)集,我們將使用Keras 庫中的兩個類來定義我們的模型。

下面列出了所需的進(jìn)口。

# first neural network with keras tutorial

from numpy import loadtxt

from keras.models import Sequential

from keras.layers import Dense

...


我們現(xiàn)在可以加載我們的數(shù)據(jù)集。

在本 Keras 教程中,我們將使用皮馬印第安人糖尿病發(fā)病數(shù)據(jù)集。這是來自 UCI 機(jī)器學(xué)習(xí)存儲庫的標(biāo)準(zhǔn)機(jī)器學(xué)習(xí)數(shù)據(jù)集。它描述了皮馬印第安人的患者病歷數(shù)據(jù),以及他們是否在五年內(nèi)患上糖尿病。

因此,這是一個二元分類問題(糖尿病的發(fā)病為 1 或不為 0)。描述每個患者的所有輸入變量都是數(shù)字變量。這使得它很容易直接與需要數(shù)值輸入和輸出值的神經(jīng)網(wǎng)絡(luò)一起使用,并且非常適合我們在 Keras 中的第一個神經(jīng)網(wǎng)絡(luò)。

數(shù)據(jù)集可從這里獲得:

  • 數(shù)據(jù)集 CSV 文件 (pima-indians-diabetes.csv)

  • 數(shù)據(jù)集詳情

下載數(shù)據(jù)集并將其放在本地工作目錄中,與 python 文件的位置相同。

用文件名保存它:

pima-indians-diabetes.csv


查看文件內(nèi)部,您應(yīng)該會看到如下所示的數(shù)據(jù)行:

6,148,72,35,0,33.6,0.627,50,1

1,85,66,29,0,26.6,0.351,31,0

8,183,64,0,0,23.3,0.672,32,1

1,89,66,23,94,28.1,0.167,21,0

0,137,40,35,168,43.1,2.288,33,1

...

我們現(xiàn)在可以使用 NumPy 函數(shù)loadtxt()將文件加載為數(shù)字矩陣。

有八個輸入變量和一個輸出變量(最后一列)。我們將學(xué)習(xí)一個模型,將輸入變量 (X) 的行映射到輸出變量 (y),我們通常將其總結(jié)為y = f(X)。

這些變量可以總結(jié)如下:

輸入變量 (X):

  1. 懷孕次數(shù)

  2. 口服葡萄糖耐量試驗(yàn)中 2 小時的血漿葡萄糖濃度

  3. 舒張壓 (mm Hg)

  4. 三頭肌皮褶厚度(mm)

  5. 2 小時血清胰島素 (mu U/ml)

  6. 體重指數(shù)(體重公斤/(身高米)^2)

  7. 糖尿病譜系函數(shù)

  8. 年齡(歲)

輸出變量 (y):

  1. 類變量(0 或 1)

一旦將 CSV 文件加載到內(nèi)存中,我們就可以將數(shù)據(jù)列拆分為輸入和輸出變量。

數(shù)據(jù)將存儲在二維數(shù)組中,其中第一個維度是行,第二個維度是列,例如 [行,列]。

我們可以通過使用標(biāo)準(zhǔn) NumPy切片運(yùn)算符或“:”選擇列的子集將數(shù)組拆分為兩個數(shù)組,我們可以通過切片 0:8 選擇從索引 0 到索引 7 的前 8 列。然后我們可以通過索引 8 選擇輸出列(第 9 個變量)。


...

# 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]

...


我們現(xiàn)在準(zhǔn)備定義我們的神經(jīng)網(wǎng)絡(luò)模型。

注意,數(shù)據(jù)集有 9 列,范圍 0:8 將選擇從 0 到 7 的列,在索引 8 之前停止。如果這對您來說是新的,那么您可以在這篇文章中了解有關(guān)數(shù)組切片和范圍的更多信息:

  • 如何在 Python 中為機(jī)器學(xué)習(xí)索引、切片和重塑 NumPy 數(shù)組


2. 定義 Keras 模型

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

我們創(chuàng)建了一個Sequential 模型并一次添加一層,直到我們對我們的網(wǎng)絡(luò)架構(gòu)感到滿意為止。

正確的第一件事是確保輸入層具有正確數(shù)量的輸入特征。這可以在使用input_dim參數(shù)創(chuàng)建第一層并將其設(shè)置為 8 的 8 個輸入變量時指定。

我們?nèi)绾沃缹拥臄?shù)量及其類型?

這是一個非常難的問題。我們可以使用一些啟發(fā)式方法,通常最好的網(wǎng)絡(luò)結(jié)構(gòu)是通過反復(fù)試驗(yàn)的過程找到的(我在此處對此進(jìn)行了更多解釋)。通常,您需要一個足夠大的網(wǎng)絡(luò)來捕獲問題的結(jié)構(gòu)。

在這個例子中,我們將使用一個具有三層的全連接網(wǎng)絡(luò)結(jié)構(gòu)。

全連接層使用Dense 類定義。我們可以指定層中神經(jīng)元或節(jié)點(diǎn)的數(shù)量作為第一個參數(shù),并使用activation參數(shù)指定激活函數(shù)。

我們將在前兩層使用稱為 ReLU的整流線性單元激活函數(shù),在輸出層使用 Sigmoid 函數(shù)。

過去,所有層都首選 Sigmoid 和 Tanh 激活函數(shù)?,F(xiàn)在,使用 ReLU 激活函數(shù)可以獲得更好的性能。我們在輸出層使用 sigmoid 以確保我們的網(wǎng)絡(luò)輸出介于 0 和 1 之間,并且可以輕松映射到類別 1 的概率或使用默認(rèn)閾值 0.5 捕捉到任一類別的硬分類。

我們可以通過添加每一層將它們拼湊在一起:

  • 該模型需要具有 8 個變量的數(shù)據(jù)行(input_dim=8參數(shù))

  • 第一個隱藏層有 12 個節(jié)點(diǎn),使用 relu 激活函數(shù)。

  • 第二個隱藏層有8個節(jié)點(diǎn),使用relu激活函數(shù)。

  • 輸出層有一個節(jié)點(diǎn),使用sigmoid激活函數(shù)。

...

# 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'))

...


注意,這里最令人困惑的是模型輸入的形狀被定義為第一個隱藏層的參數(shù)。這意味著添加第一個 Dense 層的代碼行做了兩件事,定義輸入或可見層和第一個隱藏層。

3.編譯Keras模型

現(xiàn)在模型已定義,我們可以編譯它。

編譯模型使用了有效的數(shù)字庫(所謂的后端),例如 Theano 或 TensorFlow。后端會自動選擇表示網(wǎng)絡(luò)的最佳方式,用于訓(xùn)練和預(yù)測以在您的硬件(例如 CPU 或 GPU 甚至分布式)上運(yùn)行。

編譯時,我們必須指定訓(xùn)練網(wǎng)絡(luò)時所需的一些附加屬性。請記住,訓(xùn)練網(wǎng)絡(luò)意味著找到最佳權(quán)重集以將輸入映射到我們數(shù)據(jù)集中的輸出。

我們必須指定用于評估一組權(quán)重的損失函數(shù),優(yōu)化器用于搜索網(wǎng)絡(luò)的不同權(quán)重以及我們希望在訓(xùn)練期間收集和報告的任何可選指標(biāo)。

在這種情況下,我們將使用交叉熵作為損失參數(shù)。這種損失是針對二元分類問題的,在 Keras 中被定義為“?binary_crossentropy?”。您可以在此處了解有關(guān)根據(jù)您的問題選擇損失函數(shù)的更多信息:

  • 訓(xùn)練深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)時如何選擇損失函數(shù)

我們將優(yōu)化器定義為高效的隨機(jī)梯度下降算法“?adam?”。這是梯度下降的流行版本,因?yàn)樗鼤詣诱{(diào)整自身并在廣泛的問題中給出良好的結(jié)果。要了解有關(guān) Adam 版本的隨機(jī)梯度下降的更多信息,請參閱帖子:

  • 深度學(xué)習(xí)的 Adam 優(yōu)化算法簡介

最后,因?yàn)檫@是一個分類問題,我們將收集并報告通過度量參數(shù)定義的分類準(zhǔn)確度。

...

# compile the keras model

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

...


4. 擬合 Keras 模型

我們已經(jīng)定義了我們的模型并編譯它準(zhǔn)備進(jìn)行高效計算。

現(xiàn)在是對一些數(shù)據(jù)執(zhí)行模型的時候了。

我們可以通過調(diào)用模型上的fit()函數(shù)在加載的數(shù)據(jù)上訓(xùn)練或擬合模型。

訓(xùn)練發(fā)生在 epoch 上,每個 epoch 被分成批次。

  • Epoch:一次遍歷訓(xùn)練數(shù)據(jù)集中的所有行。

  • Batch:在更新權(quán)重之前,模型在一個時期內(nèi)考慮的一個或多個樣本。

一個時期由一個或多個批次組成,基于所選的批次大小,并且該模型適用于多個時期。有關(guān) epochs 和 batches 之間差異的更多信息,請參閱帖子:

  • 神經(jīng)網(wǎng)絡(luò)中的批處理和紀(jì)元有什么區(qū)別?

訓(xùn)練過程將通過稱為 epochs 的數(shù)據(jù)集運(yùn)行固定次數(shù)的迭代,我們必須使用epochs參數(shù)指定。我們還必須設(shè)置在每個時期內(nèi)更新模型權(quán)重之前考慮的數(shù)據(jù)集行數(shù),稱為批大小,并使用batch_size參數(shù)進(jìn)行設(shè)置。

對于這個問題,我們將運(yùn)行少量時期(150)并使用相對較小的批次大小 10。

這些配置可以通過反復(fù)試驗(yàn)通過實(shí)驗(yàn)來選擇。我們希望對模型進(jìn)行足夠的訓(xùn)練,以便它學(xué)習(xí)到輸入數(shù)據(jù)行到輸出分類的良好(或足夠好)映射。模型總會有一些錯誤,但對于給定的模型配置,錯誤量會在某個時間點(diǎn)后趨于平穩(wěn)。這稱為模型收斂。

...

# fit the keras model on the dataset

model.fit(X, y, epochs=150, batch_size=10)

...


這是在您的 CPU 或 GPU 上進(jìn)行工作的地方。

此示例不需要 GPU,但如果您對如何在云中廉價地在 GPU 硬件上運(yùn)行大型模型感興趣,請參閱此帖子:

  • 如何設(shè)置 Amazon AWS EC2 GPU 來訓(xùn)練 Keras 深度學(xué)習(xí)模型

5. 評估 Keras 模型

我們已經(jīng)在整個數(shù)據(jù)集上訓(xùn)練了我們的神經(jīng)網(wǎng)絡(luò),我們可以在同一數(shù)據(jù)集上評估網(wǎng)絡(luò)的性能。

這只會讓我們了解我們對數(shù)據(jù)集建模的程度(例如訓(xùn)練準(zhǔn)確性),但不知道算法在新數(shù)據(jù)上的表現(xiàn)如何。我們這樣做是為了簡單起見,但理想情況下,您可以將數(shù)據(jù)分成訓(xùn)練和測試數(shù)據(jù)集,用于訓(xùn)練和評估模型。

您可以使用模型上的evaluate()函數(shù)在訓(xùn)練數(shù)據(jù)集上評估模型,并將用于訓(xùn)練模型的相同輸入和輸出傳遞給它。

這將為每個輸入和輸出對生成預(yù)測并收集分?jǐn)?shù),包括平均損失和您配置的任何指標(biāo),例如準(zhǔn)確性。

評估()函數(shù)將返回兩個值的列表。第一個是模型在數(shù)據(jù)集上的損失,第二個是模型在數(shù)據(jù)集上的準(zhǔn)確性。我們只對報告準(zhǔn)確性感興趣,因此我們將忽略損失值。

...

# evaluate the keras model

_, accuracy = model.evaluate(X, y)

print('Accuracy: %.2f' % (accuracy*100))



6. 把它們綁在一起

您剛剛看到了如何在 Keras 中輕松創(chuàng)建您的第一個神經(jīng)網(wǎng)絡(luò)模型。

讓我們將它們組合成一個完整的代碼示例。

您可以將所有代碼復(fù)制到 Python 文件中,并將其另存為“?keras_first_network.py?”,與數(shù)據(jù)文件“?pima-indians-diabetes.csv?”位于同一目錄中。然后,您可以從命令行(命令提示符)將 Python 文件作為腳本運(yùn)行,如下所示:

python keras_first_network.py


運(yùn)行此示例,您應(yīng)該看到 150 個 epoch 中的每個 epoch 打印損失和準(zhǔn)確度的消息,然后是在訓(xùn)練數(shù)據(jù)集上對訓(xùn)練模型的最終評估。

在我的 CPU 上運(yùn)行的工作站上執(zhí)行大約需要 10 秒。

理想情況下,我們希望損失為零,準(zhǔn)確度為 1.0(例如 100%)。這對于最微不足道的機(jī)器學(xué)習(xí)問題是不可能的。相反,我們的模型中總會有一些錯誤。目標(biāo)是選擇一個模型配置和訓(xùn)練配置,以實(shí)現(xiàn)給定數(shù)據(jù)集的最低損失和最高準(zhǔn)確度。




...

768/768 [==============================] - 0s 63us/step - loss: 0.4817 - acc: 0.7708

Epoch 147/150

768/768 [==============================] - 0s 63us/step - loss: 0.4764 - acc: 0.7747

Epoch 148/150

768/768 [==============================] - 0s 63us/step - loss: 0.4737 - acc: 0.7682

Epoch 149/150

768/768 [==============================] - 0s 64us/step - loss: 0.4730 - acc: 0.7747

Epoch 150/150

768/768 [==============================] - 0s 63us/step - loss: 0.4754 - acc: 0.7799

768/768 [==============================] - 0s 38us/step

Accuracy: 76.56


請注意,如果您嘗試在 IPython 或 Jupyter 筆記本中運(yùn)行此示例,您可能會收到錯誤消息。

原因是訓(xùn)練期間的輸出進(jìn)度條。您可以通過在調(diào)用fit()evaluate()函數(shù)時設(shè)置verbose=0輕松關(guān)閉這些功能,例如:




...

# fit the keras model on the dataset without progress bars

model.fit(X, y, epochs=150, batch_size=10, verbose=0)

# evaluate the keras model

_, accuracy = model.evaluate(X, y, verbose=0)

...


注意:您的結(jié)果可能會因算法或評估程序的隨機(jī)性或數(shù)值精度的差異而有所不同??紤]多次運(yùn)行該示例并比較平均結(jié)果。

你得了多少分?
在下面的評論中發(fā)布您的結(jié)果。

神經(jīng)網(wǎng)絡(luò)是一種隨機(jī)算法,這意味著每次運(yùn)行代碼時,相同數(shù)據(jù)上的相同算法可以訓(xùn)練具有不同技能的不同模型。這是一個功能,而不是一個錯誤。您可以在帖子中了解有關(guān)此內(nèi)容的更多信息:

  • 在機(jī)器學(xué)習(xí)中擁抱隨機(jī)性

模型性能的差異意味著要獲得模型性能的合理近似值,您可能需要多次擬合并計算準(zhǔn)確度分?jǐn)?shù)的平均值。有關(guān)這種評估神經(jīng)網(wǎng)絡(luò)的方法的更多信息,請參閱帖子:

  • 如何評估深度學(xué)習(xí)模型的技能

例如,以下是重新運(yùn)行示例 5 次的準(zhǔn)確度分?jǐn)?shù):


Accuracy: 75.00

Accuracy: 77.73

Accuracy: 77.60

Accuracy: 78.12

Accuracy: 76.17



我們可以看到所有的準(zhǔn)確度分?jǐn)?shù)都在 77% 左右,平均值為 76.924%。

7. 做出預(yù)測

我被問到的第一個問題是:

訓(xùn)練模型后,如何使用它對新數(shù)據(jù)進(jìn)行預(yù)測?

很好的問題。

我們可以調(diào)整上面的例子并使用它來生成對訓(xùn)練數(shù)據(jù)集的預(yù)測,假裝它是一個我們以前從未見過的新數(shù)據(jù)集。

進(jìn)行預(yù)測就像在模型上調(diào)用predict()函數(shù)一樣簡單。我們在輸出層使用 sigmoid 激活函數(shù),因此預(yù)測將是 0 到 1 范圍內(nèi)的概率。我們可以通過四舍五入輕松地將它們轉(zhuǎn)換為該分類任務(wù)的清晰二元預(yù)測。

例如:


...

# make probability predictions with the model

predictions = model.predict(X)

# round predictions

rounded = [round(x[0]) for x in predictions]



或者,我們可以在模型上調(diào)用predict_classes()函數(shù)來直接預(yù)測清晰的類,例如:


...

# make class predictions with the model

predictions = model.predict_classes(X)



下面的完整示例對數(shù)據(jù)集中的每個示例進(jìn)行預(yù)測,然后打印數(shù)據(jù)集中前 5 個示例的輸入數(shù)據(jù)、預(yù)測類別和預(yù)期類別。

運(yùn)行示例不會像以前那樣顯示進(jìn)度條,因?yàn)槲覀儗⒃敿?xì)參數(shù)設(shè)置為 0。

模型擬合后,對數(shù)據(jù)集中的所有示例進(jìn)行預(yù)測,并打印前 5 個示例的輸入行和預(yù)測類值,并與預(yù)期類值進(jìn)行比較。

我們可以看到大多數(shù)行都被正確預(yù)測。事實(shí)上,根據(jù)我們在上一節(jié)中估計的模型性能,我們預(yù)計大約 76.9% 的行會被正確預(yù)測。




[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)



如果您想了解有關(guān)如何使用 Keras 模型進(jìn)行預(yù)測的更多信息,請參閱帖子:

  • 如何使用 Keras 進(jìn)行預(yù)測

Keras 教程總結(jié)

在本文中,您了解了如何使用強(qiáng)大的 Keras Python 庫來創(chuàng)建您的第一個神經(jīng)網(wǎng)絡(luò)模型以進(jìn)行深度學(xué)習(xí)。

具體來說,您學(xué)習(xí)了使用 Keras 創(chuàng)建神經(jīng)網(wǎng)絡(luò)或深度學(xué)習(xí)模型的六個關(guān)鍵步驟,包括:

  1. 如何加載數(shù)據(jù)。

  2. 如何在 Keras 中定義神經(jīng)網(wǎng)絡(luò)。

  3. 如何使用高效的數(shù)值后端編譯 Keras 模型。

  4. 如何在數(shù)據(jù)上訓(xùn)練模型。

  5. 如何在數(shù)據(jù)上評估模型。

  6. 如何使用模型進(jìn)行預(yù)測。

Keras 教程擴(kuò)展

干得好,您已經(jīng)使用 Python 中的 Keras 深度學(xué)習(xí)庫成功開發(fā)了您的第一個神經(jīng)網(wǎng)絡(luò)。

本節(jié)提供了您可能想要探索的本教程的一些擴(kuò)展。

  • 調(diào)整模型。更改模型的配置或訓(xùn)練過程,看看是否可以提高模型的性能,例如達(dá)到 76% 以上的準(zhǔn)確率。

  • 保存模型。更新教程以將模型保存到文件,然后稍后加載并使用它進(jìn)行預(yù)測(請參閱本教程)。

  • 總結(jié)模型。更新教程以總結(jié)模型并創(chuàng)建模型層圖(請參閱本教程)。

  • 單獨(dú)的訓(xùn)練和測試數(shù)據(jù)集。將加載的數(shù)據(jù)集拆分為訓(xùn)練集和測試集(基于行拆分),并使用一組來訓(xùn)練模型,另一組來估計模型在新數(shù)據(jù)上的性能。

  • 繪制學(xué)習(xí)曲線。fit() 函數(shù)返回一個歷史對象,該對象總結(jié)了每個 epoch 結(jié)束時的損失和準(zhǔn)確度。創(chuàng)建此數(shù)據(jù)的線圖,稱為學(xué)習(xí)曲線(請參閱本教程)。

  • 學(xué)習(xí)一個新的數(shù)據(jù)集。更新教程以使用不同的表格數(shù)據(jù)集,可能來自UCI 機(jī)器學(xué)習(xí)存儲庫。

  • 使用函數(shù)式 API。更新教程以使用 Keras Functional API 來定義模型(請參閱本教程)。

版權(quán)聲明:文章來自公眾號(python風(fēng)控模型),未經(jīng)許可,不得抄襲。遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。





Keras 開發(fā)你的第一個 Python 深度學(xué)習(xí)項目的評論 (共 條)

分享到微博請遵守國家法律
兴海县| 澄江县| 海阳市| 图片| 孟连| 巴彦淖尔市| 淮阳县| 溆浦县| 秀山| 鄂托克旗| 湘潭县| 雷山县| 临城县| 铜山县| 西盟| 齐齐哈尔市| 竹山县| 县级市| 崇文区| 溧水县| 布拖县| 滨海县| 盐源县| 利辛县| 嘉禾县| 达拉特旗| 南溪县| 大厂| 邹城市| 万州区| 沈丘县| 满洲里市| 梁平县| 遵义市| 浪卡子县| 湖北省| 甘南县| 涞水县| 灵丘县| 耒阳市| 苏尼特左旗|