TensorFlow 2.0 keras開(kāi)發(fā)深度學(xué)習(xí)模型實(shí)例:多層感知器(MLP),卷積神經(jīng)網(wǎng)絡(luò)(CNN)
原文鏈接:http://tecdat.cn/?p=15850
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
?
在本文中,您將發(fā)現(xiàn)如何使用標(biāo)準(zhǔn)深度學(xué)習(xí)模型(包括多層感知器(MLP),卷積神經(jīng)網(wǎng)絡(luò)(CNN)和遞歸神經(jīng)網(wǎng)絡(luò)(RNN))開(kāi)發(fā),評(píng)估和做出預(yù)測(cè)。
開(kāi)發(fā)多層感知器模型
多層感知器模型(簡(jiǎn)稱MLP)是標(biāo)準(zhǔn)的全連接神經(jīng)網(wǎng)絡(luò)模型。
它由節(jié)點(diǎn)層組成,其中每個(gè)節(jié)點(diǎn)連接到上一層的所有輸出,每個(gè)節(jié)點(diǎn)的輸出連接到下一層節(jié)點(diǎn)的所有輸入。
通過(guò)一個(gè)或多個(gè)密集層創(chuàng)建MLP?。此模型適用于表格數(shù)據(jù),即表格或電子表格中的數(shù)據(jù),每個(gè)變量一列,每個(gè)變量一行。您可能需要使用MLP探索三個(gè)預(yù)測(cè)建模問(wèn)題;它們是二進(jìn)制分類,多分類和回歸。
讓我們針對(duì)每種情況在真實(shí)數(shù)據(jù)集上擬合模型。
?
二進(jìn)制分類的MLP
我們將使用二進(jìn)制(兩類)分類數(shù)據(jù)集來(lái)演示用于二進(jìn)制分類的MLP。
該數(shù)據(jù)集涉及預(yù)測(cè)結(jié)構(gòu)是否在大氣中或不給定雷達(dá)回波。
數(shù)據(jù)集將使用Pandas自動(dòng)下載。
電離層數(shù)據(jù)集(csv)?
電離層數(shù)據(jù)集描述(csv)?
我們將使用LabelEncoder將字符串標(biāo)簽編碼為整數(shù)值0和1。該模型將適合67%的數(shù)據(jù),其余的33%將用于評(píng)估,請(qǐng)使用train_test_split()函數(shù)進(jìn)行拆分。
最好將'?relu?'激活與'?he_normal?'權(quán)重初始化一起使用。在訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)模型時(shí),這種組合可以大大克服梯度消失的問(wèn)題。
該模型預(yù)測(cè)1類的可能性,并使用S型激活函數(shù)。?
下面列出了代碼片段。
# mlp二分類包
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
# 加載數(shù)據(jù)
path = 'osph.csv'
df = read_csv(path, header=None)
# 分割輸入和輸出
X, y = df.values[:, :-1], df.values[:, -1]
# ensure all data are floating point values
X = X.astype('float32')
# 文本轉(zhuǎn)換數(shù)字變量
y = LabelEncoder().fit_transform(y)
# 分割訓(xùn)練測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
# 定義輸入變量維度
n_features = X_train.shape[1]
#定義模型
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# 擬合模型
model.fit(X_train, y_train, epochs=150, batch_size=32, verbose=0)
?
運(yùn)行示例將首先報(bào)告數(shù)據(jù)集的形狀,然后擬合模型并在測(cè)試數(shù)據(jù)集上對(duì)其進(jìn)行評(píng)估。最后,對(duì)單行數(shù)據(jù)進(jìn)行預(yù)測(cè)。
鑒于學(xué)習(xí)算法的隨機(jī)性,您的具體結(jié)果會(huì)有所不同。嘗試運(yùn)行該示例幾次。
?
在這種情況下,我們可以看到該模型實(shí)現(xiàn)了約94%的分類準(zhǔn)確度,然后預(yù)測(cè)單行數(shù)據(jù)屬于1類的概率為0.9。
(235, 34) (116, 34) (235,) (116,)
Test Accuracy: 0.940
Predicted: 0.991
?
用于多類分類的MLP
我們將使用鳶尾花多類分類數(shù)據(jù)集來(lái)演示用于多類分類的MLP。
該問(wèn)題涉及在給定花的度量的情況下預(yù)測(cè)鳶尾花的種類。
數(shù)據(jù)集將使用Pandas自動(dòng)下載,但您可以在此處了解更多信息。
鳶尾花數(shù)據(jù)集(csv)?
鳶尾花數(shù)據(jù)集描述(csv)?
鑒于它是一個(gè)多類分類,因此該模型在輸出層中的每個(gè)類必須具有一個(gè)節(jié)點(diǎn),并使用softmax激活函數(shù)。損失函數(shù)是'?sparse_categorical_crossentropy?',它適用于整數(shù)編碼的類標(biāo)簽(例如,一個(gè)類為0,下一類為1,等等)
下面列出了在鳶尾花數(shù)據(jù)集上擬合和評(píng)估MLP的代碼片段。
# 預(yù)測(cè)
row = [5.1,3.5,1.4,0.2]
yhat = model.predict([row])
print('Predicted: %s (class=%d)' % (yhat, argmax(yhat)))
?
運(yùn)行示例將首先報(bào)告數(shù)據(jù)集的形狀,然后擬合模型并在測(cè)試數(shù)據(jù)集上對(duì)其進(jìn)行評(píng)估。最后,對(duì)單行數(shù)據(jù)進(jìn)行預(yù)測(cè)。
鑒于學(xué)習(xí)算法的隨機(jī)性,您的具體結(jié)果會(huì)有所不同。嘗試運(yùn)行該示例幾次。
?
在這種情況下,我們可以看到該模型實(shí)現(xiàn)了約98%的分類精度,然后預(yù)測(cè)了屬于每個(gè)類別的一行數(shù)據(jù)的概率,盡管類別0的概率最高。
(100, 4) (50, 4) (100,) (50,)
Test Accuracy: 0.980
Predicted: [[0.8680804 0.12356871 0.00835086]] (class=0)
回歸的MLP
我們將使用波士頓住房回歸數(shù)據(jù)集來(lái)演示用于回歸預(yù)測(cè)建模的MLP。
這個(gè)問(wèn)題涉及根據(jù)房屋和鄰里的屬性來(lái)預(yù)測(cè)房屋價(jià)值。
數(shù)據(jù)集將使用Pandas自動(dòng)下載,但您可以在此處了解更多信息。
波士頓住房數(shù)據(jù)集(csv)。
波士頓房屋數(shù)據(jù)集說(shuō)明(csv)。
這是一個(gè)回歸問(wèn)題,涉及預(yù)測(cè)單個(gè)數(shù)值。因此,輸出層具有單個(gè)節(jié)點(diǎn),并使用默認(rèn)或線性激活函數(shù)(無(wú)激活函數(shù))。擬合模型時(shí),均方誤差(mse)損失最小。
?
# 預(yù)測(cè)
row = [0.00632,18.00,2.310,0,0.5380,6.5750,65.20,4.0900,1,296.0,15.30,396.90,4.98]
yhat = model.predict([row])
print('Predicted: %.3f' % yhat)
?運(yùn)行示例首先報(bào)告數(shù)據(jù)集的形狀,然后擬合模型并在測(cè)試數(shù)據(jù)集上對(duì)其進(jìn)行評(píng)估。最后,對(duì)單行數(shù)據(jù)進(jìn)行預(yù)測(cè)。
鑒于學(xué)習(xí)算法的隨機(jī)性,您的具體結(jié)果會(huì)有所不同。嘗試運(yùn)行該示例幾次。
?
在這種情況下,我們可以看到該模型實(shí)現(xiàn)了約60的MSE,即約7的RMSE。然后,對(duì)于單個(gè)示例,預(yù)測(cè)值約為26。
(339, 13) (167, 13) (339,) (167,)
MSE: 60.751, RMSE: 7.794
Predicted: 26.983
?
開(kāi)發(fā)卷積神經(jīng)網(wǎng)絡(luò)模型
卷積神經(jīng)網(wǎng)絡(luò)(簡(jiǎn)稱CNN)是一種專為圖像輸入而設(shè)計(jì)的網(wǎng)絡(luò)。
它們由具有卷積層的模型組成,這些卷積層提取特征(稱為特征圖),并匯集將特征分解為最顯著元素的層。
盡管CNN可以用于將圖像作為輸入的各種任務(wù),但它們最適合圖像分類任務(wù)。
流行的圖像分類任務(wù)是MNIST手寫(xiě)數(shù)字分類。它涉及成千上萬(wàn)個(gè)手寫(xiě)數(shù)字,必須將其分類為0到9之間的數(shù)字。
tf.keras API提供了便捷功能,可以直接下載和加載此數(shù)據(jù)集。
下面的示例加載數(shù)據(jù)集并繪制前幾張圖像。
pyplot.subplot(5, 5, i+1)
# 繪制原始像素
pyplot.imshow(trainX[i], cmap=pyplot.get_cmap('gray'))
# 顯示圖片
pyplot.show()
?
運(yùn)行示例將加載MNIST數(shù)據(jù)集,然后匯總默認(rèn)的訓(xùn)練和測(cè)試數(shù)據(jù)集。
Train: X=(60000, 28, 28), y=(60000,)
Test: X=(10000, 28, 28), y=(10000,)
然后創(chuàng)建一個(gè)圖,顯示訓(xùn)練數(shù)據(jù)集中的手寫(xiě)圖像示例網(wǎng)格。

MNIST數(shù)據(jù)集中的手寫(xiě)數(shù)字圖
我們可以訓(xùn)練CNN模型對(duì)MNIST數(shù)據(jù)集中的圖像進(jìn)行分類。
注意,圖像是灰度像素?cái)?shù)據(jù)的陣列;因此,在將圖像用作模型的輸入之前,必須向數(shù)據(jù)添加通道維度。原因是CNN模型期望圖像采用通道最后格式,即網(wǎng)絡(luò)的每個(gè)示例均具有[行,列,通道]的尺寸,其中通道代表圖像數(shù)據(jù)的彩色通道。
訓(xùn)練CNN時(shí),將像素值從默認(rèn)范圍0-255縮放到0-1也是一個(gè)好主意。?
下面列出了在MNIST數(shù)據(jù)集上擬合和評(píng)估CNN模型的代碼片段。
# 預(yù)測(cè)
image = x_train[0]
yhat = model.predict([[image]])
print('Predicted: class=%d' % argmax(yhat))
運(yùn)行示例將首先報(bào)告數(shù)據(jù)集的形狀,然后擬合模型并在測(cè)試數(shù)據(jù)集上對(duì)其進(jìn)行評(píng)估。最后,對(duì)單個(gè)圖像進(jìn)行預(yù)測(cè)。
?
首先,報(bào)告每個(gè)圖像的形狀以及類別數(shù);我們可以看到每個(gè)圖像都是28×28像素,并且我們有10個(gè)類別。
在這種情況下,我們可以看到該模型在測(cè)試數(shù)據(jù)集上實(shí)現(xiàn)了約98%的分類精度。然后我們可以看到該模型預(yù)測(cè)了訓(xùn)練集中的第一幅圖像的5類。
(28, 28, 1) 10
Accuracy: 0.987
Predicted: class=5
?
開(kāi)發(fā)遞歸神經(jīng)網(wǎng)絡(luò)模型
遞歸神經(jīng)網(wǎng)絡(luò)(簡(jiǎn)稱RNN)旨在對(duì)數(shù)據(jù)序列進(jìn)行操作。
事實(shí)證明,它們對(duì)于自然語(yǔ)言處理問(wèn)題非常有效,在自然語(yǔ)言處理問(wèn)題中,將文本序列作為模型的輸入。RNN在時(shí)間序列預(yù)測(cè)和語(yǔ)音識(shí)別方面也取得了一定程度的成功。
RNN最受歡迎的類型是長(zhǎng)期短期記憶網(wǎng)絡(luò),簡(jiǎn)稱LSTM。LSTM可用于模型中,以接受輸入數(shù)據(jù)序列并進(jìn)行預(yù)測(cè),例如分配類別標(biāo)簽或預(yù)測(cè)數(shù)值,例如序列中的下一個(gè)值或多個(gè)值。
我們將使用汽車(chē)銷(xiāo)售數(shù)據(jù)集來(lái)證明LSTM RNN用于單變量時(shí)間序列預(yù)測(cè)。
這個(gè)問(wèn)題涉及預(yù)測(cè)每月的汽車(chē)銷(xiāo)售數(shù)量。
數(shù)據(jù)集將使用Pandas自動(dòng)下載,但您可以在此處了解更多信息。
汽車(chē)銷(xiāo)售數(shù)據(jù)集(csv)。
汽車(chē)銷(xiāo)售數(shù)據(jù)集說(shuō)明(csv)。
我們將用最近五個(gè)月的數(shù)據(jù)窗口作為問(wèn)題的框架,以預(yù)測(cè)當(dāng)月的數(shù)據(jù)。
為了實(shí)現(xiàn)這一點(diǎn),我們將定義一個(gè)名為split_sequence()的新函數(shù),該函數(shù)會(huì)將輸入序列拆分為適合擬合監(jiān)督學(xué)習(xí)模型(如LSTM)的數(shù)據(jù)窗口。
例如,如果順序是:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
?
然后,用于訓(xùn)練模型的樣本將如下所示:
Input Output
1, 2, 3, 4, 5 6
2, 3, 4, 5, 6 7
3, 4, 5, 6, 7 8
...
我們將使用最近12個(gè)月的數(shù)據(jù)作為測(cè)試數(shù)據(jù)集。
LSTM期望數(shù)據(jù)集中的每個(gè)樣本都具有兩個(gè)維度。第一個(gè)是時(shí)間步數(shù)(在這種情況下為5),第二個(gè)是每個(gè)時(shí)間步的觀測(cè)數(shù)(在這種情況下為1)。
因?yàn)檫@是回歸型問(wèn)題,所以我們將在輸出層中使用線性激活函數(shù)(無(wú)激活函數(shù))并優(yōu)化均方誤差損失函數(shù)。我們還將使用平均絕對(duì)誤差(MAE)指標(biāo)評(píng)估模型。
下面列出了針對(duì)單變量時(shí)間序列預(yù)測(cè)問(wèn)題擬合和評(píng)估LSTM的示例。
# lstm 時(shí)間序列預(yù)測(cè)庫(kù)
from numpy import sqrt
from numpy import asarray
from pandas import read_csv
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
# 分割樣本
def split_sequence(sequence, n_steps):
X, y = list(), list()
for i in range(len(sequence)):
# find the end of this pattern
end_ix = i + n_steps
if end_ix > len(sequence)-1:
break
#合并輸入和輸出
seq_x, seq_y = sequence[i:end_ix], sequence[end_ix]
X.append(seq_x)
y.append(seq_y)
return asarray(X), asarray(y)
# 加載數(shù)據(jù)
path = 'sales.csv'
df = read_csv(path, header=0, index_col=0, squeeze=True)
# retrieve the values
values = df.values.astype('float32')
#定義窗口大小
n_steps = 5
運(yùn)行示例將首先報(bào)告數(shù)據(jù)集的形狀,然后擬合模型并在測(cè)試數(shù)據(jù)集上對(duì)其進(jìn)行評(píng)估。最后,對(duì)單個(gè)示例進(jìn)行了預(yù)測(cè)。
鑒于學(xué)習(xí)算法的隨機(jī)性,您的具體結(jié)果會(huì)有所不同。嘗試運(yùn)行該示例幾次。
?
在這種情況下,模型的MAE約為2,800,并從測(cè)試集中預(yù)測(cè)序列中的下一個(gè)值為13,199,其中預(yù)期值為14,577(非常接近)。
(91, 5, 1) (12, 5, 1) (91,) (12,)
MSE: 12755421.000, RMSE: 3571.473, MAE: 2856.084
Predicted: 13199.325
注意:優(yōu)良作法是在擬合模型之前對(duì)數(shù)據(jù)進(jìn)行差分和使其穩(wěn)定。
如何使用高級(jí)模型功能
在本節(jié)中,您將發(fā)現(xiàn)如何使用一些稍微高級(jí)的模型功能,例如查看學(xué)習(xí)曲線并保存模型以備后用。
如何可視化深度學(xué)習(xí)模型
深度學(xué)習(xí)模型的架構(gòu)可能很快變得龐大而復(fù)雜。
因此,對(duì)模型中的連接和數(shù)據(jù)流有一個(gè)清晰的了解非常重要。如果您使用功能性API來(lái)確保確實(shí)按照預(yù)期的方式連接了模型的各層,那么這一點(diǎn)尤其重要。
您可以使用兩種工具來(lái)可視化模型:文本描述和繪圖。
文字說(shuō)明
可以通過(guò)在模型上調(diào)用summary()函數(shù)來(lái)顯示模型的文本描述。
下面的示例定義了一個(gè)三層的小模型,然后總結(jié)了結(jié)構(gòu)。
# 定義模型
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(8,)))
model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1, activation='sigmoid'))
# 摘要
model.summary()
運(yùn)行示例將打印每個(gè)層的摘要以及總摘要。
這是用于檢查模型中輸出形狀和參數(shù)(權(quán)重)數(shù)量的診斷。
Model: "sequential"
_________________________________________________________________
Layer (type)???????????????? Output Shape??????????????Param #
=================================================================
dense (Dense)????????????????(None, 10)????????????????90
_________________________________________________________________
dense_1 (Dense)??????????????(None, 8)???????????????? 88
_________________________________________________________________
dense_2 (Dense)??????????????(None, 1)???????????????? 9
=================================================================
Total params: 187
Trainable params: 187
Non-trainable params: 0
_________________________________________________________________
?
模型架構(gòu)圖
您可以通過(guò)調(diào)用plot_model()函數(shù)來(lái)創(chuàng)建模型圖。
這將創(chuàng)建一個(gè)圖像文件,其中包含模型中各層的方框圖和折線圖。
下面的示例創(chuàng)建一個(gè)小的三層模型,并將模型體系結(jié)構(gòu)的圖保存到包括輸入和輸出形狀的'?model.png?'。
# 可視化摘要
plot_model(model, 'model.png', show_shapes=True)
運(yùn)行示例將創(chuàng)建一個(gè)模型圖,該圖顯示具有形狀信息的每個(gè)圖層的框,以及連接圖層的箭頭,以顯示通過(guò)網(wǎng)絡(luò)的數(shù)據(jù)流。

神經(jīng)網(wǎng)絡(luò)架構(gòu)圖
如何繪制模型學(xué)習(xí)曲線
學(xué)習(xí)曲線是神經(jīng)網(wǎng)絡(luò)模型隨時(shí)間變化的曲線圖,例如在每個(gè)訓(xùn)練時(shí)期結(jié)束時(shí)計(jì)算的曲線。
學(xué)習(xí)曲線圖可洞悉模型的學(xué)習(xí)動(dòng)態(tài),例如模型是否學(xué)習(xí)得很好,模型是否適合訓(xùn)練數(shù)據(jù)集或模型是否適合訓(xùn)練數(shù)據(jù)集。
您可以輕松地為您的深度學(xué)習(xí)模型創(chuàng)建學(xué)習(xí)曲線。
首先,您必須更新對(duì)fit函數(shù)的調(diào)用,以包括對(duì)驗(yàn)證數(shù)據(jù)集的引用。這是訓(xùn)練集的一部分,不用于擬合模型,而是用于在訓(xùn)練過(guò)程中評(píng)估模型的性能。
您可以手動(dòng)拆分?jǐn)?shù)據(jù)并指定validation_data參數(shù),也可以使用validation_split參數(shù)并指定訓(xùn)練數(shù)據(jù)集的拆分百分比,然后讓API為您執(zhí)行拆分。后者目前比較簡(jiǎn)單。
fit函數(shù)將返回一個(gè)歷史對(duì)象,其中包含在每個(gè)訓(xùn)練時(shí)期結(jié)束時(shí)記錄的性能指標(biāo)的痕跡。這包括選擇的損失函數(shù)和每個(gè)配置的度量(例如準(zhǔn)確性),并且為訓(xùn)練和驗(yàn)證數(shù)據(jù)集計(jì)算每個(gè)損失和度量。
學(xué)習(xí)曲線是訓(xùn)練數(shù)據(jù)集和驗(yàn)證數(shù)據(jù)集上的損失圖。我們可以使用Matplotlib庫(kù)從歷史對(duì)象創(chuàng)建此圖。
下面的示例將小型神經(jīng)網(wǎng)絡(luò)適合于合成二進(jìn)制分類問(wèn)題。在訓(xùn)練期間,使用30%的驗(yàn)證比例來(lái)評(píng)估模型,然后使用折線圖繪制訓(xùn)練和驗(yàn)證數(shù)據(jù)集上的交叉熵?fù)p失。
# 繪制學(xué)習(xí)曲線
pyplot.title('Learning Curves')
pyplot.xlabel('Epoch')
pyplot.ylabel('Cross Entropy')
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='val')
pyplot.legend()
pyplot.show()
運(yùn)行示例使模型擬合數(shù)據(jù)集。運(yùn)行結(jié)束時(shí),將返回歷史對(duì)象,并將其用作創(chuàng)建折線圖的基礎(chǔ)。
可以通過(guò)“?損失?”變量訪問(wèn)訓(xùn)練數(shù)據(jù)集的交叉熵?fù)p失,并通過(guò)歷史對(duì)象的歷史記錄屬性上的“?val_loss?”訪問(wèn)驗(yàn)證數(shù)據(jù)集的損失。

深度學(xué)習(xí)模型的交叉熵?fù)p失學(xué)習(xí)曲線
如何保存和加載模型
訓(xùn)練和評(píng)估模型很棒,但是我們可能希望稍后使用模型而不必每次都對(duì)其進(jìn)行重新訓(xùn)練。
這可以通過(guò)將模型保存到文件中,然后加載它并使用它進(jìn)行預(yù)測(cè)來(lái)實(shí)現(xiàn)。
這可以通過(guò)使用模型上的save()函數(shù)來(lái)保存模型來(lái)實(shí)現(xiàn)。稍后可以使用load_model()函數(shù)加載它。
模型以H5格式(一種有效的陣列存儲(chǔ)格式)保存。因此,您必須確保在工作站上安裝了h5py庫(kù)。這可以使用pip來(lái)實(shí)現(xiàn);例如:
pip install h5py
下面的示例將一個(gè)簡(jiǎn)單模型擬合為合成二進(jìn)制分類問(wèn)題,然后保存模型文件。
# 保存模型樣例
from sklearn.datasets import make_classification
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import SGD
# 數(shù)據(jù)集
X, y = make_classification(n_samples=1000, n_features=4, n_classes=2, random_state=1)
# determine the number of input features
n_features = X.shape[1]
# 定義模型
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dense(1, activation='sigmoid'))
# 編譯模型
sgd = SGD(learning_rate=0.001, momentum=0.8)
model.compile(optimizer=sgd, loss='binary_crossentropy')
# 擬合
model.fit(X, y, epochs=100, batch_size=32, verbose=0, validation_split=0.3)
# 保存
model.save('model.h5')
?運(yùn)行示例將適合模型,并將其保存到名為“?model.h5?”的文件中。
然后,我們可以加載模型并使用它進(jìn)行預(yù)測(cè),或者繼續(xù)訓(xùn)練它,或者用它做我們想做的任何事情。
下面的示例加載模型并使用它進(jìn)行預(yù)測(cè)。
# 加載保存的模型
from sklearn.datasets import make_classification
from tensorflow.keras.models import load_model
# 數(shù)據(jù)
X, y = make_classification(n_samples=1000, n_features=4, n_classes=2, random_state=1)
# 加載模型
model = load_model('model.h5')
# 預(yù)測(cè)
row = [1.91518414, 1.14995454, -1.52847073, 0.79430654]
yhat = model.predict([row])
print('Predicted: %.3f' % yhat[0])
運(yùn)行示例將從文件中加載圖像,然后使用它對(duì)新的數(shù)據(jù)行進(jìn)行預(yù)測(cè)并打印結(jié)果。
Predicted: 0.831
?
如何獲得更好的模型性能
在本部分中,您將發(fā)現(xiàn)一些可用于改善深度學(xué)習(xí)模型性能的技術(shù)。
改善深度學(xué)習(xí)性能的很大一部分涉及通過(guò)減慢學(xué)習(xí)過(guò)程或在適當(dāng)?shù)臅r(shí)間停止學(xué)習(xí)過(guò)程來(lái)避免過(guò)度擬合。
如何減少過(guò)度擬合:Dropout
這是在訓(xùn)練過(guò)程中實(shí)現(xiàn)的,在訓(xùn)練過(guò)程中,一些圖層輸出被隨機(jī)忽略或“?掉線?”。
您可以在要?jiǎng)h除輸入連接的圖層之前,在新模型中將Dropout添加為模型。
這涉及添加一個(gè)稱為Dropout()的層,該層接受一個(gè)參數(shù),該參數(shù)指定前一個(gè)輸出的每個(gè)輸出下降的概率。例如0.4表示每次更新模型都會(huì)刪除40%的輸入。
您也可以在MLP,CNN和RNN模型中添加Dropout層,盡管您也可能想探索與CNN和RNN模型一起使用的Dropout的特殊版本。
下面的示例將一個(gè)小型神經(jīng)網(wǎng)絡(luò)模型擬合為一個(gè)合成二進(jìn)制分類問(wèn)題。
在第一隱藏層和輸出層之間插入一個(gè)具有50%濾除率的濾除層。
# ?dropout樣例
from sklearn.datasets import make_classification
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
from matplotlib import pyplot
# 數(shù)據(jù)
X, y = make_classification(n_samples=1000, n_classes=2, random_state=1)
# determine the number of input features
n_features = X.shape[1]
# 模型
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
# 編譯模型
model.compile(optimizer='adam', loss='binary_crossentropy')
# 擬合模型
model.fit(X, y, epochs=100, batch_size=32, verbose=0)
如何通過(guò)批量歸一化來(lái)加速訓(xùn)練
某一層的輸入的規(guī)模和分布會(huì)極大地影響該層的訓(xùn)練程度。
這通常就是為什么在使用神經(jīng)網(wǎng)絡(luò)模型進(jìn)行建模之前先標(biāo)準(zhǔn)化輸入數(shù)據(jù)是一個(gè)好主意的原因。
批處理規(guī)范化是一種用于訓(xùn)練非常深的神經(jīng)網(wǎng)絡(luò)的技術(shù),該技術(shù)可將每個(gè)輸入標(biāo)準(zhǔn)化。這具有穩(wěn)定學(xué)習(xí)過(guò)程并顯著減少訓(xùn)練深度網(wǎng)絡(luò)所需的訓(xùn)練時(shí)期的數(shù)量的效果。
?
您可以在網(wǎng)絡(luò)中使用批量歸一化,方法是在希望具有標(biāo)準(zhǔn)化輸入的層之前添加一個(gè)批量歸一化層。您可以對(duì)MLP,CNN和RNN模型使用批標(biāo)準(zhǔn)化。
?
下面的示例定義了一個(gè)用于二進(jìn)制分類預(yù)測(cè)問(wèn)題的小型MLP網(wǎng)絡(luò),在第一隱藏層和輸出層之間具有批處理歸一化層。
# 標(biāo)準(zhǔn)化
from sklearn.datasets import make_classification
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import BatchNormalization
from matplotlib import pyplot
# 數(shù)據(jù)
X, y = make_classification(n_samples=1000, n_classes=2, random_state=1)
# 輸入特征定義
n_features = X.shape[1]
# 定義模型
model = Sequential()
model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))
model.add(BatchNormalization())
model.add(Dense(1, activation='sigmoid'))
# 編譯模型
model.compile(optimizer='adam', loss='binary_crossentropy')
#擬合模型
model.fit(X, y, epochs=100, batch_size=32, verbose=0)
?
如何在適當(dāng)?shù)臅r(shí)間停止訓(xùn)練并盡早停止
神經(jīng)網(wǎng)絡(luò)具有挑戰(zhàn)性。
訓(xùn)練太少,模型不適合;訓(xùn)練過(guò)多,模型過(guò)度適合訓(xùn)練數(shù)據(jù)集。兩種情況都導(dǎo)致模型的有效性降低。
解決此問(wèn)題的一種方法是使用提前停止。這涉及監(jiān)視訓(xùn)練數(shù)據(jù)集和驗(yàn)證數(shù)據(jù)集(訓(xùn)練集的子集未用于擬合模型)的損失。一旦驗(yàn)證集的損失開(kāi)始顯示過(guò)度擬合的跡象,訓(xùn)練過(guò)程就可以停止。
?
通過(guò)首先確保您具有驗(yàn)證數(shù)據(jù)集,可以對(duì)模型使用提前停止。您可以通過(guò)fit()函數(shù)的validation_data參數(shù)手動(dòng)定義驗(yàn)證數(shù)據(jù)集,也可以使用validation_split并指定要保留以進(jìn)行驗(yàn)證的訓(xùn)練數(shù)據(jù)集的數(shù)量。
然后,您可以定義EarlyStopping并指示它監(jiān)視要監(jiān)視的性能度量,例如“?val_loss?”以確認(rèn)驗(yàn)證數(shù)據(jù)集的損失,以及在采取措施之前觀察到的過(guò)度擬合的時(shí)期數(shù),例如5。
然后,可以通過(guò)采用回調(diào)列表的“?callbacks?”參數(shù)將已配置的EarlyStopping回調(diào)提供給fit()函數(shù)。
這使您可以將時(shí)期數(shù)設(shè)置為大量,并確信一旦模型開(kāi)始過(guò)度擬合,訓(xùn)練就會(huì)結(jié)束。您可能還想創(chuàng)建一條學(xué)習(xí)曲線,以發(fā)現(xiàn)更多有關(guān)跑步和停止訓(xùn)練的學(xué)習(xí)動(dòng)態(tài)的見(jiàn)解。
下面的示例演示了有關(guān)合成二進(jìn)制分類問(wèn)題的小型神經(jīng)網(wǎng)絡(luò),該問(wèn)題在模型開(kāi)始過(guò)度擬合后(約50個(gè)歷元后)立即使用停止功能停止訓(xùn)練。
#停止訓(xùn)練
es = EarlyStopping(monitor='val_loss', patience=5)
# 擬合模型
history = model.fit(X, y, epochs=200, batch_size=32, verbose=0, validation_split=0.3, callbacks=[es])
?

參考文獻(xiàn)
1.r語(yǔ)言用神經(jīng)網(wǎng)絡(luò)改進(jìn)nelson-siegel模型擬合收益率曲線分析
2.r語(yǔ)言實(shí)現(xiàn)擬合神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)和結(jié)果可視化
3.python用遺傳算法-神經(jīng)網(wǎng)絡(luò)-模糊邏輯控制算法對(duì)樂(lè)透分析
4.用于nlp的python:使用keras的多標(biāo)簽文本lstm神經(jīng)網(wǎng)絡(luò)分類
5.用r語(yǔ)言實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)股票實(shí)例
6.R語(yǔ)言基于Keras的小數(shù)據(jù)集深度學(xué)習(xí)圖像分類
7.用于NLP的seq2seq模型實(shí)例用Keras實(shí)現(xiàn)神經(jīng)機(jī)器翻譯
8.python中基于網(wǎng)格搜索算法優(yōu)化的深度學(xué)習(xí)模型分析糖
9.matlab使用貝葉斯優(yōu)化的深度學(xué)習(xí)
?