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

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

TensorFlow 2.0 keras開(kāi)發(fā)深度學(xué)習(xí)模型實(shí)例:多層感知器(MLP),卷積神經(jīng)網(wǎng)絡(luò)(CNN)

2021-05-31 21:43 作者:拓端tecdat  | 我要投稿

原文鏈接: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ù)。?

下面列出了代碼片段。

  1. # mlp二分類包

  2. from pandas import read_csv

  3. from sklearn.model_selection import train_test_split

  4. from sklearn.preprocessing import LabelEncoder

  5. from tensorflow.keras import Sequential

  6. from tensorflow.keras.layers import Dense

  7. # 加載數(shù)據(jù)

  8. path = 'osph.csv'

  9. df = read_csv(path, header=None)

  10. # 分割輸入和輸出

  11. X, y = df.values[:, :-1], df.values[:, -1]

  12. # ensure all data are floating point values

  13. X = X.astype('float32')

  14. # 文本轉(zhuǎn)換數(shù)字變量

  15. y = LabelEncoder().fit_transform(y)

  16. # 分割訓(xùn)練測(cè)試集

  17. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)

  18. print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

  19. # 定義輸入變量維度

  20. n_features = X_train.shape[1]

  21. #定義模型

  22. model = Sequential()

  23. model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))

  24. model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))

  25. model.add(Dense(1, activation='sigmoid'))

  26. # compile the model

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

  28. # 擬合模型

  29. 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。

  1. (235, 34) (116, 34) (235,) (116,)

  2. Test Accuracy: 0.940

  3. 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的代碼片段。


  1. # 預(yù)測(cè)

  2. row = [5.1,3.5,1.4,0.2]

  3. yhat = model.predict([row])

  4. 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的概率最高。

  1. (100, 4) (50, 4) (100,) (50,)

  2. Test Accuracy: 0.980

  3. 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)損失最小。

?


  1. # 預(yù)測(cè)

  2. 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]

  3. yhat = model.predict([row])

  4. 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。

  1. (339, 13) (167, 13) (339,) (167,)

  2. MSE: 60.751, RMSE: 7.794

  3. 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ù)集并繪制前幾張圖像。


  1. pyplot.subplot(5, 5, i+1)

  2. # 繪制原始像素

  3. pyplot.imshow(trainX[i], cmap=pyplot.get_cmap('gray'))

  4. # 顯示圖片

  5. pyplot.show()

?

運(yùn)行示例將加載MNIST數(shù)據(jù)集,然后匯總默認(rèn)的訓(xùn)練和測(cè)試數(shù)據(jù)集。

  1. Train: X=(60000, 28, 28), y=(60000,)

  2. 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模型的代碼片段。


  1. # 預(yù)測(cè)

  2. image = x_train[0]

  3. yhat = model.predict([[image]])

  4. 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類。

  1. (28, 28, 1) 10

  2. Accuracy: 0.987

  3. 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)練模型的樣本將如下所示:

  1. Input Output

  2. 1, 2, 3, 4, 5 6

  3. 2, 3, 4, 5, 6 7

  4. 3, 4, 5, 6, 7 8

  5. ...

我們將使用最近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的示例。

  1. # lstm 時(shí)間序列預(yù)測(cè)庫(kù)

  2. from numpy import sqrt

  3. from numpy import asarray

  4. from pandas import read_csv

  5. from tensorflow.keras import Sequential

  6. from tensorflow.keras.layers import Dense

  7. from tensorflow.keras.layers import LSTM


  8. # 分割樣本

  9. def split_sequence(sequence, n_steps):

  10. X, y = list(), list()

  11. for i in range(len(sequence)):

  12. # find the end of this pattern

  13. end_ix = i + n_steps

  14. if end_ix > len(sequence)-1:

  15. break

  16. #合并輸入和輸出

  17. seq_x, seq_y = sequence[i:end_ix], sequence[end_ix]

  18. X.append(seq_x)

  19. y.append(seq_y)

  20. return asarray(X), asarray(y)


  21. # 加載數(shù)據(jù)

  22. path = 'sales.csv'

  23. df = read_csv(path, header=0, index_col=0, squeeze=True)

  24. # retrieve the values

  25. values = df.values.astype('float32')

  26. #定義窗口大小

  27. 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(非常接近)。

  1. (91, 5, 1) (12, 5, 1) (91,) (12,)

  2. MSE: 12755421.000, RMSE: 3571.473, MAE: 2856.084

  3. 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)。


  1. # 定義模型

  2. model = Sequential()

  3. model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(8,)))

  4. model.add(Dense(8, activation='relu', kernel_initializer='he_normal'))

  5. model.add(Dense(1, activation='sigmoid'))

  6. # 摘要

  7. model.summary()

運(yùn)行示例將打印每個(gè)層的摘要以及總摘要。

這是用于檢查模型中輸出形狀和參數(shù)(權(quán)重)數(shù)量的診斷。

  1. Model: "sequential"

  2. _________________________________________________________________

  3. Layer (type)???????????????? Output Shape??????????????Param #

  4. =================================================================

  5. dense (Dense)????????????????(None, 10)????????????????90

  6. _________________________________________________________________

  7. dense_1 (Dense)??????????????(None, 8)???????????????? 88

  8. _________________________________________________________________

  9. dense_2 (Dense)??????????????(None, 1)???????????????? 9

  10. =================================================================

  11. Total params: 187

  12. Trainable params: 187

  13. Non-trainable params: 0

  14. _________________________________________________________________

?

模型架構(gòu)圖

您可以通過(guò)調(diào)用plot_model()函數(shù)來(lái)創(chuàng)建模型圖。

這將創(chuàng)建一個(gè)圖像文件,其中包含模型中各層的方框圖和折線圖。

下面的示例創(chuàng)建一個(gè)小的三層模型,并將模型體系結(jié)構(gòu)的圖保存到包括輸入和輸出形狀的'?model.png?'。


  1. # 可視化摘要

  2. 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失。

  1. # 繪制學(xué)習(xí)曲線

  2. pyplot.title('Learning Curves')

  3. pyplot.xlabel('Epoch')

  4. pyplot.ylabel('Cross Entropy')

  5. pyplot.plot(history.history['loss'], label='train')

  6. pyplot.plot(history.history['val_loss'], label='val')

  7. pyplot.legend()

  8. 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)題,然后保存模型文件。

  1. # 保存模型樣例

  2. from sklearn.datasets import make_classification

  3. from tensorflow.keras import Sequential

  4. from tensorflow.keras.layers import Dense

  5. from tensorflow.keras.optimizers import SGD

  6. # 數(shù)據(jù)集

  7. X, y = make_classification(n_samples=1000, n_features=4, n_classes=2, random_state=1)

  8. # determine the number of input features

  9. n_features = X.shape[1]

  10. # 定義模型

  11. model = Sequential()

  12. model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))

  13. model.add(Dense(1, activation='sigmoid'))

  14. # 編譯模型

  15. sgd = SGD(learning_rate=0.001, momentum=0.8)

  16. model.compile(optimizer=sgd, loss='binary_crossentropy')

  17. # 擬合

  18. model.fit(X, y, epochs=100, batch_size=32, verbose=0, validation_split=0.3)

  19. # 保存

  20. model.save('model.h5')

?運(yùn)行示例將適合模型,并將其保存到名為“?model.h5?”的文件中。

然后,我們可以加載模型并使用它進(jìn)行預(yù)測(cè),或者繼續(xù)訓(xùn)練它,或者用它做我們想做的任何事情。

下面的示例加載模型并使用它進(jìn)行預(yù)測(cè)。

  1. # 加載保存的模型

  2. from sklearn.datasets import make_classification

  3. from tensorflow.keras.models import load_model

  4. # 數(shù)據(jù)

  5. X, y = make_classification(n_samples=1000, n_features=4, n_classes=2, random_state=1)

  6. # 加載模型

  7. model = load_model('model.h5')

  8. # 預(yù)測(cè)

  9. row = [1.91518414, 1.14995454, -1.52847073, 0.79430654]

  10. yhat = model.predict([row])

  11. 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%濾除率的濾除層。

  1. # ?dropout樣例

  2. from sklearn.datasets import make_classification

  3. from tensorflow.keras import Sequential

  4. from tensorflow.keras.layers import Dense

  5. from tensorflow.keras.layers import Dropout

  6. from matplotlib import pyplot

  7. # 數(shù)據(jù)

  8. X, y = make_classification(n_samples=1000, n_classes=2, random_state=1)

  9. # determine the number of input features

  10. n_features = X.shape[1]

  11. # 模型

  12. model = Sequential()

  13. model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))

  14. model.add(Dropout(0.5))

  15. model.add(Dense(1, activation='sigmoid'))

  16. # 編譯模型

  17. model.compile(optimizer='adam', loss='binary_crossentropy')

  18. # 擬合模型

  19. 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ò),在第一隱藏層和輸出層之間具有批處理歸一化層。

  1. # 標(biāo)準(zhǔn)化

  2. from sklearn.datasets import make_classification

  3. from tensorflow.keras import Sequential

  4. from tensorflow.keras.layers import Dense

  5. from tensorflow.keras.layers import BatchNormalization

  6. from matplotlib import pyplot

  7. # 數(shù)據(jù)

  8. X, y = make_classification(n_samples=1000, n_classes=2, random_state=1)

  9. # 輸入特征定義

  10. n_features = X.shape[1]

  11. # 定義模型

  12. model = Sequential()

  13. model.add(Dense(10, activation='relu', kernel_initializer='he_normal', input_shape=(n_features,)))

  14. model.add(BatchNormalization())

  15. model.add(Dense(1, activation='sigmoid'))

  16. # 編譯模型

  17. model.compile(optimizer='adam', loss='binary_crossentropy')

  18. #擬合模型

  19. 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)練。


  1. #停止訓(xùn)練

  2. es = EarlyStopping(monitor='val_loss', patience=5)

  3. # 擬合模型

  4. 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í)

?


TensorFlow 2.0 keras開(kāi)發(fā)深度學(xué)習(xí)模型實(shí)例:多層感知器(MLP),卷積神經(jīng)網(wǎng)絡(luò)(CNN)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
台东县| 滨州市| 柳江县| 文水县| 武冈市| 蚌埠市| 青岛市| 余干县| 日喀则市| 武强县| 柞水县| 鹿邑县| 玉屏| 翁源县| 长子县| 聊城市| 保定市| 凉山| 凌云县| 平遥县| 云霄县| 宽城| 当阳市| 延寿县| 富源县| 丰台区| 新宾| 龙川县| 鹤庆县| 开化县| 新昌县| 河北省| 乌拉特前旗| 阳山县| 原阳县| 桂东县| 镇原县| 铁力市| 丽江市| 鄄城县| 广饶县|