LSTM是一種時間遞歸神經(jīng)網(wǎng)絡(luò),,適合于處理和預測時間序列中間隔和延遲相對較長的重要事件,。在自然語言處理、語言識別等一系列的應用上都取得了很好的效果,。 《Long Short Term Memory Networks with Python》是澳大利亞機器學習專家Jason Brownlee的著作,,里面詳細介紹了LSTM模型的原理和使用。 該書總共分為十四個章節(jié),,具體如下: 第一章:什么是LSTMs,? 第二章:怎么樣訓練LSTMs? 第三章:怎么樣準備LSTMs的數(shù)據(jù),? 第四章:怎么樣在Keras中開發(fā)LSTMs,?(本期內(nèi)容) 第五章:序列預測建模(下周一發(fā)布) 第六章:怎么樣開發(fā)一個Vanilla LSTM模型,? 第七章:怎么樣開發(fā)Stacked LSTMs,? 第八章:開發(fā)CNN LSTM模型 第九章:開發(fā)Encoder-Decoder LSTMs 第十章:開發(fā)Bidirectional LSTMs 第十一章:開發(fā)生成LSTMs 第十二章:診斷和調(diào)試LSTMs 第十三章:怎么樣用LSTMs做預測? 第十四章:更新LSTMs模型 本文的作者對此書進行了翻譯整理之后,,分享給大家,,本文是第四期內(nèi)容。 第一期內(nèi)容為:一萬字純干貨|機器學習博士手把手教你入門LSTM(附代碼資料) 第二期內(nèi)容為:干貨推薦|如何基于時間的反向傳播算法來訓練LSTMs,? 第三期內(nèi)容為:干貨推薦|如何準備用于LSTM模型的數(shù)據(jù)并進行序列預測,?(附代碼) 我們還將繼續(xù)推出一系列的文章來介紹里面的詳細內(nèi)容,和大家一起來共同學習,,支持答疑,!支持答疑,!支持答疑!重要的事情說三遍,!您在學習過程中遇到相關(guān)問題,,都可在文章底部給我們留言!一定會回復你的,! 本文有11000字左右,,閱讀需11分鐘,建議收藏學習,。 4.0 前言4.0.1 課程目標本課程的目標是理解如何使用Python中的Keras深度學習庫來定義,、擬合和評價LSTM模型。完成這一課之后,,你會知道:
4.0.2 課程概覽本課程分為7個部分,,它們是:
讓我們開始吧! 4.1 定義模型第一步是定義你的網(wǎng)絡(luò),。Keras中的神經(jīng)網(wǎng)絡(luò)被定義為一系列的層,。這些層的容器是 例如,我們可以定義一個具有兩個存儲單元的LSTM隱藏層,,連接著帶有一個神經(jīng)元的一個全連接輸出層,,如下:
表 4.1 定義一個LSTM模型的例子 但是我們也可以通過創(chuàng)建一個層的數(shù)組,并將其傳遞給
表 4.2 第二個定義一個LSTM模型的例子 網(wǎng)絡(luò)中的第一個隱藏層必須定義期望輸出的數(shù)量,,例如輸入層的形狀。輸入必須是三維的,,由樣本,、時間步長和特征組成,。
假設(shè)你的數(shù)據(jù)被加載為了一個NumPy數(shù)組,,你可以使用NumPy中的thereshape() 函數(shù)將1D或者2D的數(shù)據(jù)集轉(zhuǎn)換為3D數(shù)據(jù)集,。您可以調(diào)用您的NumPy數(shù)組中的NumPy函數(shù),并傳遞給一個元組的維數(shù)給它,,該維數(shù)就是你需要轉(zhuǎn)成多少維的值,。假設(shè)我們在NumPy數(shù)組中有兩個列的輸入數(shù)據(jù)(X),我們可以把這兩個列當做兩個時間步長來對待,,將其改寫如下:
表 4.3 變換有1個時間步長的NumPy數(shù)組的例子 如果你想讓你的2D數(shù)據(jù)中的列成為一個時間步長的特征,,你可以變形,如下:
表 4.4 變換有1個時間步長的NumPy數(shù)組的例子 你可以指定輸入形狀參數(shù),,該參數(shù)期望是一個包含時間步長和特征數(shù)量的元祖,。例如,如果我們有一個單變量序列的兩個時間步長和一個特征,,每行具有兩個之后的觀測值,,則具體如下:
表 4.5 定義LSTM模型的輸入的例子 樣本的數(shù)量不必是指定的。模型假定一個或者多個樣本,,留給你定義的只有時間步長以及特征,。本課的章節(jié)提供了為LSTM模型準備輸入數(shù)據(jù)的附加示例。 把
表 4.6 在輸出層帶有sigmoid激活函數(shù)LSTM模型的例子 激活函數(shù)的選擇對于輸出層來說是最重要的,,因為它將決定預測所采用的格式。例如,,下面是一些常見的預測建模問題類型和結(jié)構(gòu)以及在輸出層中使用的標準激活函數(shù):
4.2 編譯模型一旦開發(fā)了我們的網(wǎng)絡(luò),,我們就必須編譯它。編譯是一個有效的步驟,。它將我們所定義的簡單層序列轉(zhuǎn)換成一系列高效的矩陣變換格式,,以便在GPU或者CPU上執(zhí)行,這取決于Keras是如何配置的,。將編譯看做是一個網(wǎng)絡(luò)的預計算步驟,。一個模型建立之后總是需要編譯的。 編譯需要多個參數(shù)被指定,,尤其是那些需要調(diào)整來訓練你網(wǎng)絡(luò)的,。具體來說,用于網(wǎng)絡(luò)訓練的優(yōu)化函數(shù)以及用于評價網(wǎng)絡(luò)的損失函數(shù),,它被優(yōu)化函數(shù)最小化了,。 例如,,下面是編譯指定梯度下降(sgd)和均方差(mse)的損失函數(shù)模型的情況,用于解決回歸類型的問題,。
表 4.7 編譯LSTM模型的例子 或者,,在提供編譯不走的參數(shù)之前創(chuàng)建和配置
表 4.8 用SGD優(yōu)化算法編譯一個LSTM模型的例子 預測建模問題的類型可對所使用的損失函數(shù)進行約束,。例如,,下面是不同的預測模型類型的一些標準損失函數(shù):
最常見的優(yōu)化算法是經(jīng)典的隨機梯度下降算法,,但是Keras還支持一套其他擴展的經(jīng)典優(yōu)化算法,,這種算法表現(xiàn)很好,、配置很少,。由于它們通常的性能更好,也許最常用的優(yōu)化算法是:
最后,,除了損失函數(shù)外,,你也可以指定性能指標(Metrics)來收集擬合你模型時候的信息??偟膩碚f,,最有用的附加性能指標(Metrics)來收集的是分類問題的準確性(例如‘a(chǎn)ccuracy’或者簡稱‘a(chǎn)cc’ )。用來收集的性能指標(Metrics)可以通過性能指標(Metrics)數(shù)組中的名稱或者損失函數(shù)的名字來指定,。例如:
表 4.9 用一個性能指標(Metrics)編譯LSTM模型的例子 4.3 擬合模型一旦網(wǎng)絡(luò)被編譯,,它就可以擬合,這意味著適應訓練數(shù)據(jù)集上的權(quán)重,。擬合網(wǎng)絡(luò)需要指定訓練數(shù)據(jù)集,,包括輸入模式的性能指標(Metrics)X以及和輸出類型匹配的數(shù)組 y。網(wǎng)絡(luò)采用基于時間的反向傳播算法進行訓練,,并根據(jù)優(yōu)化算法和損失函數(shù)特性對模型進行優(yōu)化,。 反向傳播算法要求對網(wǎng)絡(luò)進行訓練數(shù)據(jù)集中的所有序列進行特定數(shù)量的周期或者暴露訓練集中的所有序列,。每個周期(epoch)可以被分為成組的輸入-輸出模式對,這被稱為批次(batches),。這定義了網(wǎng)絡(luò)在一個時代內(nèi)更新權(quán)重之前所暴露的模式的數(shù)量,。它也是一種有效的優(yōu)化,確保在一段時間內(nèi)沒有太多的輸入模式被加載到存儲器中,。
下面是batch size一些常用的配置:
batch size為32的小批量梯度下降法(Mini-batch gradient descent)是LSTM的一個常見配置。擬合網(wǎng)絡(luò)的一個例子如下:
表 4.10 擬合LSTM模型的例子 一旦擬合,,返回一個歷史對象,,該對象在訓練期間提供對模型姓名的總結(jié)。當編譯模型的時候,,這包含損失和任何的額外的性能指標(Metrics)被指定,,并在每個周期(epoch)被記錄。這些性能指標(Metrics)可以被記錄,、繪制和分析,,以了解網(wǎng)絡(luò)在訓練數(shù)據(jù)集上是過擬合(overfitting)還是欠擬合(underfittting),。 根據(jù)網(wǎng)絡(luò)規(guī)模和訓練數(shù)據(jù)的大小,訓練可能會花費很長的時間,,從秒到數(shù)天,。默認情況下,進度條顯示在每個epoch的命令行上,。這可能會對你造成很多的噪音,,或者會對你的環(huán)境造成問題,比如你在一個交互式的筆記本或者IDE中,。你可以通過將
表 4.11 擬合一個LSTM模型并檢索無 4.4 評價模型一旦網(wǎng)絡(luò)被訓練,,它就可以被評估,。網(wǎng)絡(luò)可以對訓練數(shù)據(jù)進行評估,但是這不會作為預測模型提供網(wǎng)絡(luò)性能的有用指示,,因為它以前見過所有這些數(shù)據(jù),。我們可以在一個單獨的數(shù)據(jù)集上評估網(wǎng)絡(luò)的性能,在測試期間看不見,。在未來對于看不見的數(shù)據(jù),,這將提供網(wǎng)絡(luò)性能的估計。 該模型評估了所有測試模式的損失,,以及模型編譯時的任何其他度量,,如分類精度,。返回一個評估的度量表,。如,對于使用精度度量編譯模型,,我們可以在新的數(shù)據(jù)集上對其進行評估如下:
表 4.12 衡量一個LSTM模型的例子 與網(wǎng)絡(luò)一樣,,提出
表 4.13 衡量一個沒有 4.5 預測模型一旦對我們的擬合模型的性能感到滿意,,我們可以用它來預測新的數(shù)據(jù)。這就在帶有新輸入模式數(shù)組的模型上調(diào)用
表 4.14 在擬合LSTM模型上預測的例子 預測將以網(wǎng)絡(luò)的輸出層提供的格式返回,。在回歸問題的情況下,這些預測可以直接和線性激活函數(shù)提供問題的格式一樣,。 對于一個二分類問題,,預測可以使第一類的概率數(shù)組,它可以通過舍入轉(zhuǎn)換為1或0,。對于一個多分類問題,,結(jié)果可能是一個概率數(shù)組的形式(假設(shè)是一個one hot編碼輸出變量),,它可能需要使用NumPy的argmax()函數(shù)轉(zhuǎn)換成單類輸出預測。另外,,對于分類問題,,我們可以使用
表 4.15 擬合LSTM模型上預測類別的例子 隨著對網(wǎng)絡(luò)的擬合和評估,,
表 4.16 沒有 根據(jù)擬合LSTM模型來預測將會在第十三章中詳細的講述,。 4.6 LSTM狀態(tài)管理每個LSTM存儲單元都保持著積累的內(nèi)部狀態(tài),。這種內(nèi)部狀態(tài)可能需要在網(wǎng)絡(luò)訓練和預測時對序列問題進行詳細的管理。默認情況下,,網(wǎng)絡(luò)中的所有LSTM存儲單元的內(nèi)部狀態(tài)在每個批次之后被重置,,例如,當網(wǎng)絡(luò)權(quán)重被更新時,。這意味著批次大小的配置在三個時期上施加了張力:
通過頂一個LSTM層作為狀態(tài),,Keras提供了將內(nèi)部狀態(tài)更新重置的很靈活的方式。這可以通過將LSTM層上的狀態(tài)參數(shù)設(shè)置為true來實現(xiàn),。當使用狀態(tài)LSTM層時,還必須通過設(shè)置輸入形狀參數(shù)來確定網(wǎng)絡(luò)中輸入形狀的批大?。╞atch size),,并且批處理大小必須是訓練數(shù)據(jù)集中樣本數(shù)量的一個因素。 批輸入(batch input)形狀參數(shù)需要一個定義為批處理大小、時間步長和特征的三維數(shù)組,。 例如,我們可以定義一個狀態(tài)LSTM,,在訓練數(shù)據(jù)集上訓練100個樣本,10個批次大?。╞atch size),,1個特征的5個時間步長,如下:
表 4.17 定義一個帶狀態(tài)的LSTM層的例子 狀態(tài)LSTM不會在每個批次結(jié)束時重置內(nèi)部傳狀態(tài),。相反,您可以通過調(diào)用
表 4.18 一個狀態(tài)LSTM手動迭代訓練批次的例子 在進行預測時,,也必須使用相同狀態(tài)的LSTM中的相同批次大小(batch size),。
例 4.19 用狀態(tài)LSTM預測的例子 LSTM層的內(nèi)部狀態(tài)也在評估網(wǎng)絡(luò)和進行預測時積累,。因此,,如果使用的是狀態(tài)LSTM,,則必須在驗證數(shù)據(jù)集或者預測之后對網(wǎng)絡(luò)進行重置狀態(tài),。 在默認情況下,,一個周期(epoch)的狀態(tài)被洗牌。在使用神經(jīng)網(wǎng)絡(luò)的多層感知機進行工作的時候這是一個很好的做法,。如果您嘗試在樣本間保存狀態(tài),,那么訓練數(shù)據(jù)集中的樣本順序可能是重要的并且必須保留,。這可以通過設(shè)置
表 4.20 擬合一個狀態(tài)LSTM時使樣本不shuffle的例子 為了使這個更具體,下面是管理狀態(tài)的3個常見的例子:
我鼓勵你頭腦風暴你的序列預測問題和網(wǎng)絡(luò)配置的許多不同的框架,測試和選擇那些在預測誤差方面最有希望的模型,。 4.7 準備數(shù)據(jù)的例子很難理解如何準備您的序列數(shù)據(jù)以輸入到LSTM模型,。通常,圍繞如何定義LSTM模型的輸入層存在混淆,。關(guān)于如何將您的序列數(shù)據(jù)轉(zhuǎn)換為一維或二維的數(shù)字矩陣到LSTM輸入層所需的3D格式也存在混淆,。在這一節(jié)中,您將通過兩個示例來修改序列數(shù)據(jù),,并將輸入層改為LSTM模型,。 4.7.1 單個輸入樣本的LSTM的例子考慮一個具有多個時間步長和一個特征的序列。例如,,這可以是10個值的序列:
表 4.21 序列的例子 我們可以將這個序列的數(shù)字定義為NumPy數(shù)組,。
表 4.22 將一個序列定義為NumPy數(shù)組的例子 我們可以使用NumPy的
表 4.23 變換一個數(shù)組的例子 一旦變換了,,我們可以輸出數(shù)組新的形狀,。
表 4.24 打印序列新形狀的例子 將所有的都放在一起,完整的例子展示如下:
表 4.25 變換一個樣本的例子 運行例子打印單個樣本的3D形狀,。
表 4.26 單個樣本變型輸出的例子 這個數(shù)據(jù)通過設(shè)置
表 4.27 定義LSTM模型輸入層的例子 4.7.2 多輸入特征的LSTM例子考慮到你的模型可能有多個并行序列作為輸入的情況。例如,,下面是有10個值的兩個并行的序列:
表 4.28 并行序列的例子 我們可以將這些數(shù)據(jù)定義為2列10行的數(shù)據(jù):
表 4.29 將并行序列定義為一個NumPy數(shù)組的例子 這個數(shù)據(jù)可以被化為具有10個時間步長和2個特征的1個樣本,,它可以變形為3D數(shù)組如下:
表 4.30 變形一個序列的例子 將所有這些放在一起,完整的例子顯示如下:
表 4.31 變形并行序列的例子 運行例子,,打印單個樣本新的3D形狀如下:
表 4.32 變換并行序列輸出的例子 這個數(shù)據(jù)現(xiàn)在已經(jīng)通過設(shè)置
表 4.33 定義LSTM模型輸入層的例子 4.7.3 LSTM輸入的建議本章節(jié)列出了一些幫助您準備LSTM輸入數(shù)據(jù)的提示:
4.8 擴展閱讀本章節(jié)提供一些用于擴展閱讀的資料。 4.8.1 Keras APIs
4.8.2 其它APIs
4.9 擴展你想深入了解Keras中LSTMs的生命周期嗎,?這個章節(jié)列出了本課程中一些具有挑戰(zhàn)性的擴展,。
在網(wǎng)上發(fā)布你的擴展并與我分享鏈接。我很想知道你是怎么樣想的,! 4.10 總結(jié)在本課程中,,你發(fā)現(xiàn)了使用Keras庫的LSTM循環(huán)神經(jīng)網(wǎng)絡(luò)的5步生命周期。特別地,,你學到了:
您在微信公眾號后臺回復“LSTM”可獲取此書的電子版,。 下周一預告:序列預測建模 作者介紹:邵洲,,在讀博士。研究興趣:數(shù)據(jù)挖掘,、學者遷徙研究,。 由清華大學—中國工程院知識智能聯(lián)合研究中心舉辦的知識·智能系列報告會將于2019年1月份舉行第1期,屆時會邀請學術(shù)界的大咖來跟大家分享,,大家最想看到哪個主題,?請投上您寶貴的一票!??! |
|