<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Keras中長短期記憶模型的5步生命周期 > 原文: [https://machinelearningmastery.com/5-step-life-cycle-long-short-term-memory-models-keras/](https://machinelearningmastery.com/5-step-life-cycle-long-short-term-memory-models-keras/) 使用Keras在Python中創建和評估深度學習神經網絡非常容易,但您必須遵循嚴格的模型生命周期。 在這篇文章中,您將發現在Keras中創建,訓練和評估長期短期記憶(LSTM)循環神經網絡的分步生命周期,以及如何使用訓練有素的模型進行預測。 閱讀這篇文章后,你會知道: * 如何在Keras中定義,編譯,擬合和評估LSTM。 * 如何為回歸和分類序列預測問題選擇標準默認值。 * 如何將它們聯系起來,在Keras開發和運行您的第一個LSTM循環神經網絡。 讓我們開始吧。 * **2017年6月更新**:修復輸入大小調整示例中的拼寫錯誤。 ![The 5 Step Life-Cycle for Long Short-Term Memory Models in Keras](img/af98dc2c534e319ebc72e7ee514fcfa4.jpg) Keras長期短期記憶模型的5步生命周期 照片由 [docmonstereyes](https://www.flickr.com/photos/docmonstereyes/2755918484/) 拍攝,保留一些權利。 ## 概觀 下面概述了我們將要研究的Keras LSTM模型生命周期中的5個步驟。 1. 定義網絡 2. 編譯網絡 3. 適合網絡 4. 評估網絡 5. 作出預測 ### 環境 本教程假定您已安裝Python SciPy環境。您可以在此示例中使用Python 2或3。 本教程假設您安裝了TensorFlow或Theano后端的Keras v2.0或更高版本。 本教程還假設您安裝了scikit-learn,Pandas,NumPy和Matplotlib。 接下來,讓我們看看標準時間序列預測問題,我們可以將其用作此實驗的上下文。 如果您在設置Python環境時需要幫助,請參閱以下帖子: * [如何使用Anaconda設置用于機器學習和深度學習的Python環境](http://machinelearningmastery.com/setup-python-environment-machine-learning-deep-learning-anaconda/) ## 步驟1.定義網絡 第一步是定義您的網絡。 神經網絡在Keras中定義為層序列。這些層的容器是Sequential類。 第一步是創建Sequential類的實例。然后,您可以創建層并按照它們應連接的順序添加它們。由存儲器單元組成的LSTM復現層稱為LSTM()。通常跟隨LSTM層并用于輸出預測的完全連接層稱為Dense()。 例如,我們可以分兩步完成: ```py model = Sequential() model.add(LSTM(2)) model.add(Dense(1)) ``` 但是我們也可以通過創建一個層數組并將其傳遞給Sequential的構造函數來一步完成。 ```py layers = [LSTM(2), Dense(1)] model = Sequential(layers) ``` 網絡中的第一層必須定義預期的輸入數量。輸入必須是三維的,包括樣本,時間步和特征。 * **樣品**。這些是數據中的行。 * **時間步**。這些是過去對特征的觀察,例如滯后變量。 * **功能**。這些是數據中的列。 假設您的數據作為NumPy數組加載,您可以使用NumPy中的reshape()函數將2D數據集轉換為3D數據集。如果您希望列成為一個功能的時間步長,您可以使用: ```py data = data.reshape((data.shape[0], data.shape[1], 1)) ``` 如果您希望2D數據中的列成為具有一個時間步長的要素,則可以使用: ```py data = data.reshape((data.shape[0], 1, data.shape[1])) ``` 您可以指定input_shape參數,該參數需要包含時間步數和要素數的元組。例如,如果我們有兩個時間步長和一個特征用于單變量時間序列,每行有兩個滯后觀察值,則將指定如下: ```py model = Sequential() model.add(LSTM(5, input_shape=(2,1))) model.add(Dense(1)) ``` 可以通過將LSTM層添加到Sequential模型來堆疊LSTM層。重要的是,在堆疊LSTM層時,我們必須為每個輸入輸出一個序列而不是一個值,以便后續的LSTM層可以具有所需的3D輸入。我們可以通過將return_sequences參數設置為True來完成此操作。例如: ```py model = Sequential() model.add(LSTM(5, input_shape=(2,1), return_sequences=True)) model.add(LSTM(5)) model.add(Dense(1)) ``` 將Sequential模型視為一個管道,將原始數據輸入到最后,預測從另一個輸出。 這在Keras中是一個有用的容器,因為傳統上與層相關的關注點也可以拆分并作為單獨的層添加,清楚地顯示它們在從輸入到預測的數據轉換中的作用。 例如,可以提取轉換來自層中每個神經元的求和信號的激活函數,并將其作為稱為激活的層狀對象添加到Sequential中。 ```py model = Sequential() model.add(LSTM(5, input_shape=(2,1))) model.add(Dense(1)) model.add(Activation('sigmoid')) ``` 激活函數的選擇對于輸出層是最重要的,因為它將定義預測將采用的格式。 例如,下面是一些常見的預測建模問題類型以及可以在輸出層中使用的結構和標準激活函數: * **回歸**:線性激活函數,或“線性”,以及與輸出數量匹配的神經元數量。 * **二元分類(2類)**:Logistic激活函數,或'sigmoid',以及一個神經元輸出層。 * **多類分類(&gt; 2類)**:假設單熱編碼輸出模式,Softmax激活函數或'softmax',以及每類值一個輸出神經元。 ## 第2步。編譯網絡 一旦我們定義了網絡,我們就必須編譯它。 編譯是一個效率步驟。它將我們定義的簡單層序列轉換為高效的矩陣變換系列,其格式應在GPU或CPU上執行,具體取決于Keras的配置方式。 將編譯視為網絡的預計算步驟。定義模型后始終需要它。 編譯需要指定許多參數,專門用于訓練您的網絡。具體地,用于訓練網絡的優化算法和用于評估由優化算法最小化的網絡的損失函數。 例如,下面是編譯定義模型并指定隨機梯度下降(sgd)優化算法和均值誤差(mean_squared_error)損失函數的情況,用于回歸類型問題。 ```py model.compile(optimizer='sgd', loss='mean_squared_error') ``` 或者,可以在作為編譯步驟的參數提供之前創建和配置優化程序。 ```py algorithm = SGD(lr=0.1, momentum=0.3) model.compile(optimizer=algorithm, loss='mean_squared_error') ``` 預測建模問題的類型對可以使用的損失函數的類型施加約束。 例如,下面是不同預測模型類型的一些標準損失函數: * **回歸**:均值平方誤差或'mean_squared_error'。 * **二元分類(2類)**:對數損失,也稱為交叉熵或“binary_crossentropy”。 * **多類分類(&gt; 2類)**:多類對數損失或'categorical_crossentropy'。 最常見的優化算法是隨機梯度下降,但Keras還支持一套其他最先進的優化算法,這些算法在很少或沒有配置的情況下都能很好地工作。 也許最常用的優化算法因為它們通常具有更好的表現: * **隨機梯度下降**或'sgd',需要調整學習速度和動量。 * **ADAM** 或'adam',需要調整學習率。 * **RMSprop** 或'rmsprop',需要調整學習率。 最后,除了損失函數之外,您還可以指定在擬合模型時收集的度量標準。通常,要收集的最有用的附加度量標準是分類問題的準確性。要收集的度量標準由數組中的名稱指定。 例如: ```py model.compile(optimizer='sgd', loss='mean_squared_error', metrics=['accuracy']) ``` ## 步驟3.適合網絡 一旦網絡被編譯,它就可以適合,這意味著在訓練數據集上調整權重。 安裝網絡需要指定訓練數據,包括輸入模式矩陣X和匹配輸出模式數組y。 使用反向傳播算法訓練網絡,并根據編譯模型時指定的優化算法和損失函數進行優化。 反向傳播算法要求網絡訓練指定數量的時期或暴露于訓練數據集。 每個迭代可以被劃分為稱為批次的輸入 - 輸出模式對的組。這定義了在一個迭代內更新權重之前網絡所接觸的模式數。它也是一種效率優化,確保一次不會將太多輸入模式加載到內存中。 擬合網絡的最小例子如下: ```py history = model.fit(X, y, batch_size=10, epochs=100) ``` 適合后,將返回歷史對象,該對象提供訓練期間模型表現的摘要。這包括損失和編譯模型時指定的任何其他指標,記錄每個迭代。 訓練可能需要很長時間,從幾秒到幾小時到幾天,具體取決于網絡的大小和訓練數據的大小。 默認情況下,每個迭代的命令行上都會顯示一個進度條。這可能會給您帶來太多噪音,或者可能會給您的環境帶來問題,例如您使用的是交互式筆記本電腦或IDE。 通過將詳細參數設置為2,可以減少每個時期顯示的信息量。您可以通過將詳細設置為1來關閉所有輸出。例如: ```py history = model.fit(X, y, batch_size=10, epochs=100, verbose=0) ``` ## 第4步。評估網絡 一旦網絡被訓練,就可以對其進行評估。 可以在訓練數據上評估網絡,但是這不會提供作為預測模型的網絡表現的有用指示,因為它之前已經看到了所有這些數據。 我們可以在測試期間看不到的單獨數據集上評估網絡的表現。這將提供對網絡表現的估計,以便對未來看不見的數據進行預測。 該模型評估所有測試模式的損失,以及編譯模型時指定的任何其他指標,如分類準確性。返回評估指標列表。 例如,對于使用精度度量編制的模型,我們可以在新數據集上對其進行評估,如下所示: ```py loss, accuracy = model.evaluate(X, y) ``` 與擬合網絡一樣,提供詳細輸出以了解評估模型的進度。我們可以通過將verbose參數設置為0來關閉它。 ```py loss, accuracy = model.evaluate(X, y, verbose=0) ``` ## 第5步。做出預測 一旦我們對擬合模型的表現感到滿意,我們就可以使用它來預測新數據。 這就像使用新輸入模式數組調用模型上的predict()函數一樣簡單。 For example: ```py predictions = model.predict(X) ``` 預測將以網絡輸出層提供的格式返回。 在回歸問題的情況下,這些預測可以是直接問題的格式,由線性激活函數提供。 對于二元分類問題,預測可以是第一類的概率數組,其可以通過舍入轉換為1或0。 對于多類分類問題,結果可以是概率數組的形式(假設一個熱編碼輸出變量),可能需要使用argmax()NumPy函數將其轉換為單個類輸出預測。 或者,對于分類問題,我們可以使用predict_classes()函數,該函數會自動將uncrisp預測轉換為清晰的整數類值。 ```py predictions = model.predict_classes(X) ``` 與擬合和評估網絡一樣,提供詳細輸出以給出模型預測的進度的概念。我們可以通過將verbose參數設置為0來關閉它。 ```py predictions = model.predict(X, verbose=0) ``` ## 端到端工作示例 讓我們將所有這些與一個小例子結合起來。 這個例子將使用一個學習10個數字序列的簡單問題。我們將向網絡顯示一個數字,例如0.0,并期望它預測為0.1。然后顯示它0.1并期望它預測0.2,依此類推到0.9。 1. **定義網絡**:我們將構建一個LSTM神經網絡,在可見層有1個輸入時間步長和1個輸入特征,LSTM隱藏層有10個存儲單元,在完全連接的輸出層有1個神經元線性(默認)激活功能。 2. **編譯網絡**:我們將使用具有默認配置和均方誤差丟失函數的高效ADAM優化算法,因為它是一個回歸問題。 3. **適合網絡**:我們將使網絡適合1,000個時期,并使用等于訓練集中模式數量的批量大小。我們還將關閉所有詳細輸出。 4. **評估網絡**。我們將在訓練數據集上評估網絡。通常,我們會在測試或驗證集上評估模型。 5. **制作預測**。我們將對訓練輸入數據進行預測。同樣,通常我們會對我們不知道正確答案的數據做出預測。 完整的代碼清單如下。 ```py # Example of LSTM to learn a sequence from pandas import DataFrame from pandas import concat from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM # create sequence length = 10 sequence = [i/float(length) for i in range(length)] print(sequence) # create X/y pairs df = DataFrame(sequence) df = concat([df.shift(1), df], axis=1) df.dropna(inplace=True) # convert to LSTM friendly format values = df.values X, y = values[:, 0], values[:, 1] X = X.reshape(len(X), 1, 1) # 1\. define network model = Sequential() model.add(LSTM(10, input_shape=(1,1))) model.add(Dense(1)) # 2\. compile network model.compile(optimizer='adam', loss='mean_squared_error') # 3\. fit network history = model.fit(X, y, epochs=1000, batch_size=len(X), verbose=0) # 4\. evaluate network loss = model.evaluate(X, y, verbose=0) print(loss) # 5\. make predictions predictions = model.predict(X, verbose=0) print(predictions[:, 0]) ``` 運行此示例將生成以下輸出,顯示10個數字的原始輸入序列,對整個序列進行預測時網絡的均方誤差損失以及每個輸入模式的預測。 輸出間隔開以便于閱讀。 我們可以看到序列被很好地學習,特別是如果我們將預測舍入到第一個小數位。 ```py [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] 4.54527471447e-05 [ 0.11612834 0.20493418 0.29793766 0.39445466 0.49376178 0.59512401 0.69782174 0.80117452 0.90455914] ``` ## 進一步閱讀 * [順序模型](https://keras.io/models/sequential/)的Keras文檔。 * [LSTM層](https://keras.io/layers/recurrent/#lstm)的Keras文檔。 * [Keras優化算法文檔](https://keras.io/optimizers/)。 * [Keras損失函數文檔](https://keras.io/losses/)。 ## 摘要 在這篇文章中,您使用Keras庫發現了LSTM循環神經網絡的5步生命周期。 具體來說,你學到了: * 如何在Keras中為LSTM網絡定義,編譯,擬合,評估和預測。 * 如何為分類和回歸問題選擇激活函數和輸出層配置。 * 如何在Keras開發和運行您的第一個LSTM模型。 您對Keras的LSTM型號有任何疑問,或者關于這篇文章? 在評論中提出您的問題,我會盡力回答。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看