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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 如何在Python中使用TimeDistributed Layer for Long Short-Term Memory Networks > 原文: [https://machinelearningmastery.com/timedistributed-layer-for-long-short-term-memory-networks-in-python/](https://machinelearningmastery.com/timedistributed-layer-for-long-short-term-memory-networks-in-python/) 長期短期網絡或LSTM是一種流行且功能強大的循環神經網絡或RNN。 它們可能很難配置并應用于任意序列預測問題,即使使用定義良好且“易于使用”的接口,如Python中的Keras深度學習庫中提供的那些接口也是如此。 在Keras中遇到這種困難的一個原因是使用了TimeDistributed包裝層,并且需要一些LSTM層來返回序列而不是單個值。 在本教程中,您將發現為序列預測配置LSTM網絡的不同方法,TimeDistributed層所扮演的角色以及如何使用它。 完成本教程后,您將了解: * 如何設計一對一的LSTM用于序列預測。 * 如何在沒有TimeDistributed Layer的情況下設計用于序列預測的多對一LSTM。 * 如何使用TimeDistributed Layer設計多對多LSTM以進行序列預測。 讓我們開始吧。 ![How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Python](img/c6a3f825141c0b28d96fff209cf03362.jpg) 如何在Python中使用TimeDistributed Layer for Long Short-Term Memory Networks [jans canon](https://www.flickr.com/photos/43158397@N02/5774000092/) 的照片,保留一些權利。 ## 教程概述 本教程分為5個部分;他們是: 1. TimeDistributed Layer 2. 序列學習問題 3. 用于序列預測的一對一LSTM 4. 用于序列預測的多對一LSTM(沒有TimeDistributed) 5. 用于序列預測的多對多LSTM(具有TimeDistributed) ### 環境 本教程假定安裝了SciPy,NumPy和Pandas的Python 2或Python 3開發環境。 本教程還假設scikit-learn和Keras v2.0 +與Theano或TensorFlow后端一起安裝。 有關設置Python環境的幫助,請參閱帖子: * [如何使用Anaconda設置用于機器學習和深度學習的Python環境](http://machinelearningmastery.com/setup-python-environment-machine-learning-deep-learning-anaconda/) ## TimeDistributed Layer LSTM功能強大,但難以使用且難以配置,尤其適合初學者。 另一個復雜因素是 [TimeDistributed](https://keras.io/layers/wrappers/#timedistributed) Layer(以及之前的 _TimeDistributedDense_ 層),它被隱式描述為層包裝器: > 這個包裝器允許我們將一個層應用于輸入的每個時間片。 你應該如何以及何時使用LSTM的這個包裝器? 當您在Keras GitHub問題和StackOverflow上搜索有關包裝層的討論時,這種混淆更加復雜。 例如,在問題“[何時以及如何使用TimeDistributedDense](https://github.com/fchollet/keras/issues/1029) ”中,“fchollet(Keras'作者)解釋說: > TimeDistributedDense對3D張量的每個時間步應用相同的Dense(完全連接)操作。 如果您已經了解TimeDistributed層的用途以及何時使用它,那么這是完全合理的,但對初學者來說根本沒有幫助。 本教程旨在消除使用帶有LSTM的TimeDistributed包裝器的混亂,以及可以檢查,運行和使用的工作示例,以幫助您進行具體的理解。 ## 序列學習問題 我們將使用一個簡單的序列學習問題來演示TimeDistributed層。 在這個問題中,序列[0.0,0.2,0.4,0.6,0.8]將一次作為輸入一個項目給出,并且必須依次作為輸出返回,一次一個項目。 可以把它想象成一個簡單的回聲程序。我們給出0.0作為輸入,我們期望看到0.0作為輸出,對序列中的每個項重復。 我們可以直接生成這個序列如下: ```py from numpy import array length = 5 seq = array([i/float(length) for i in range(length)]) print(seq) ``` 運行此示例將打印生成的序列: ```py [ 0\. 0.2 0.4 0.6 0.8] ``` 該示例是可配置的,如果您愿意,您可以稍后自己玩更長/更短的序列。請在評論中告訴我您的結果。 ## 用于序列預測的一對一LSTM 在我們深入研究之前,重要的是要表明這種序列學習問題可以分段學習。 也就是說,我們可以將問題重新構造為序列中每個項目的輸入 - 輸出對的數據集。給定0,網絡應輸出0,給定0.2,網絡必須輸出0.2,依此類推。 這是問題的最簡單的公式,并且要求將序列分成輸入 - 輸出對,并且序列一次一步地預測并聚集在網絡外部。 輸入輸出對如下: ```py X, y 0.0, 0.0 0.2, 0.2 0.4, 0.4 0.6, 0.6 0.8, 0.8 ``` LSTM的輸入必須是三維的。我們可以將2D序列重塑為具有5個樣本,1個時間步長和1個特征的3D序列。我們將輸出定義為具有1個特征的5個樣本。 ```py X = seq.reshape(5, 1, 1) y = seq.reshape(5, 1) ``` 我們將網絡模型定義為具有1個輸入和1個時間步長。第一個隱藏層將是一個有5個單位的LSTM。輸出層是一個帶有1個輸出的全連接層。 該模型將適用于有效的ADAM優化算法和均方誤差損失函數。 批量大小設置為時期中的樣本數量,以避免必須使LSTM有狀態并手動管理狀態重置,盡管這可以很容易地完成,以便在每個樣本顯示到網絡后更新權重。 完整的代碼清單如下: ```py from numpy import array from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM # prepare sequence length = 5 seq = array([i/float(length) for i in range(length)]) X = seq.reshape(len(seq), 1, 1) y = seq.reshape(len(seq), 1) # define LSTM configuration n_neurons = length n_batch = length n_epoch = 1000 # create LSTM model = Sequential() model.add(LSTM(n_neurons, input_shape=(1, 1))) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') print(model.summary()) # train LSTM model.fit(X, y, epochs=n_epoch, batch_size=n_batch, verbose=2) # evaluate result = model.predict(X, batch_size=n_batch, verbose=0) for value in result: print('%.1f' % value) ``` 首先運行該示例將打印已配置網絡的結構。 我們可以看到LSTM層有140個參數。這是根據輸入數量(1)和輸出數量(隱藏層中5個單位為5)計算的,如下所示: ```py n = 4 * ((inputs + 1) * outputs + outputs^2) n = 4 * ((1 + 1) * 5 + 5^2) n = 4 * 35 n = 140 ``` 我們還可以看到,完全連接的層只有6個參數用于輸入數量(5個用于前一層的5個輸入),輸出數量(1個用于層中的1個神經元)和偏差。 ```py n = inputs * outputs + outputs n = 5 * 1 + 1 n = 6 ``` ```py _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= lstm_1 (LSTM) (None, 1, 5) 140 _________________________________________________________________ dense_1 (Dense) (None, 1, 1) 6 ================================================================= Total params: 146.0 Trainable params: 146 Non-trainable params: 0.0 _________________________________________________________________ ``` 網絡正確地學習預測問題。 ```py 0.0 0.2 0.4 0.6 0.8 ``` ## 用于序列預測的多對一LSTM(沒有TimeDistributed) 在本節中,我們開發了一個LSTM來一次輸出序列,盡管沒有TimeDistributed包裝層。 LSTM的輸入必須是三維的。我們可以將2D序列重塑為具有1個樣本,5個時間步長和1個特征的3D序列。我們將輸出定義為具有5個特征的1個樣本。 ```py X = seq.reshape(1, 5, 1) y = seq.reshape(1, 5) ``` 您可以立即看到,必須稍微調整問題定義,以便在沒有TimeDistributed包裝器的情況下支持網絡進行序列預測。具體來說,輸出一個向量而不是一次一步地構建輸出序列。差異可能聽起來很微妙,但了解TimeDistributed包裝器的作用非常重要。 我們將模型定義為具有5個時間步長的一個輸入。第一個隱藏層將是一個有5個單位的LSTM。輸出層是一個完全連接的層,有5個神經元。 ```py # create LSTM model = Sequential() model.add(LSTM(5, input_shape=(5, 1))) model.add(Dense(length)) model.compile(loss='mean_squared_error', optimizer='adam') print(model.summary()) ``` 接下來,我們將模型僅適用于訓練數據集中的單個樣本的500個迭代和批量大小為1。 ```py # train LSTM model.fit(X, y, epochs=500, batch_size=1, verbose=2) ``` 綜合這些,下面提供了完整的代碼清單。 ```py from numpy import array from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM # prepare sequence length = 5 seq = array([i/float(length) for i in range(length)]) X = seq.reshape(1, length, 1) y = seq.reshape(1, length) # define LSTM configuration n_neurons = length n_batch = 1 n_epoch = 500 # create LSTM model = Sequential() model.add(LSTM(n_neurons, input_shape=(length, 1))) model.add(Dense(length)) model.compile(loss='mean_squared_error', optimizer='adam') print(model.summary()) # train LSTM model.fit(X, y, epochs=n_epoch, batch_size=n_batch, verbose=2) # evaluate result = model.predict(X, batch_size=n_batch, verbose=0) for value in result[0,:]: print('%.1f' % value) ``` 首先運行該示例將打印已配置網絡的摘要。 我們可以看到LSTM層有140個參數,如上一節所述。 LSTM單元已經癱瘓,每個單元都輸出一個值,提供5個值的向量作為完全連接層的輸入。時間維度或序列信息已被丟棄并折疊成5個值的向量。 我們可以看到完全連接的輸出層有5個輸入,預計輸出5個值。我們可以解釋如下要學習的30個權重: ```py n = inputs * outputs + outputs n = 5 * 5 + 5 n = 30 ``` 網絡摘要報告如下: ```py _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= lstm_1 (LSTM) (None, 5) 140 _________________________________________________________________ dense_1 (Dense) (None, 5) 30 ================================================================= Total params: 170.0 Trainable params: 170 Non-trainable params: 0.0 _________________________________________________________________ ``` 該模型適合,在最終確定和打印預測序列之前打印損失信息。 序列被正確再現,但是作為單個部分而不是逐步通過輸入數據。我們可能使用Dense層作為第一個隱藏層而不是LSTM,因為LSTM的這種使用并沒有充分利用它們完整的序列學習和處理能力。 ```py 0.0 0.2 0.4 0.6 0.8 ``` ## 用于序列預測的多對多LSTM(具有TimeDistributed) 在本節中,我們將使用TimeDistributed層來處理LSTM隱藏層的輸出。 使用TimeDistributed包裝層時要記住兩個關鍵點: * **輸入必須(至少)為3D** 。這通常意味著您需要在TimeDistributed wrapped Dense層之前配置最后一個LSTM層以返回序列(例如,將“return_sequences”參數設置為“True”)。 * **輸出為3D** 。這意味著如果TimeDistributed包裹的Dense層是輸出層并且您正在預測序列,則需要將y數組的大小調整為3D向量。 我們可以將輸出的形狀定義為具有1個樣本,5個時間步長和1個特征,就像輸入序列一樣,如下所示: ```py y = seq.reshape(1, length, 1) ``` 我們可以通過將“ _return_sequences_ ”參數設置為true來定義LSTM隱藏層以返回序列而不是單個值。 ```py model.add(LSTM(n_neurons, input_shape=(length, 1), return_sequences=True)) ``` 這具有每個LSTM單元返回5個輸出序列的效果,輸出數據中的每個時間步長一個輸出,而不是如前一示例中的單個輸出值。 我們還可以使用輸出層上的TimeDistributed來包裝具有單個輸出的完全連接的Dense層。 ```py model.add(TimeDistributed(Dense(1))) ``` 輸出層中的單個輸出值是關鍵。它強調我們打算從輸入中的每個時間步的序列輸出一個時間步。碰巧我們將一次處理輸入序列的5個時間步。 TimeDistributed通過一次一個步驟將相同的Dense層(相同的權重)應用于LSTM輸出來實現此技巧。這樣,輸出層只需要一個連接到每個LSTM單元(加上一個偏置)。 因此,需要增加訓練時期的數量以考慮較小的網絡容量。我將它從500加倍到1000,以匹配第一個一對一的例子。 將它們放在一起,下面提供了完整的代碼清單。 ```py from numpy import array from keras.models import Sequential from keras.layers import Dense from keras.layers import TimeDistributed from keras.layers import LSTM # prepare sequence length = 5 seq = array([i/float(length) for i in range(length)]) X = seq.reshape(1, length, 1) y = seq.reshape(1, length, 1) # define LSTM configuration n_neurons = length n_batch = 1 n_epoch = 1000 # create LSTM model = Sequential() model.add(LSTM(n_neurons, input_shape=(length, 1), return_sequences=True)) model.add(TimeDistributed(Dense(1))) model.compile(loss='mean_squared_error', optimizer='adam') print(model.summary()) # train LSTM model.fit(X, y, epochs=n_epoch, batch_size=n_batch, verbose=2) # evaluate result = model.predict(X, batch_size=n_batch, verbose=0) for value in result[0,:,0]: print('%.1f' % value) ``` 運行該示例,我們可以看到已配置網絡的結構。 我們可以看到,與前面的示例一樣,LSTM隱藏層中有140個參數。 完全連接的輸出層是一個非常不同的故事。實際上,它完全符合一對一的例子。一個神經元,對于前一層中的每個LSTM單元具有一個權重,加上一個用于偏置輸入。 這有兩個重要的事情: * 允許在定義問題時構建和學習問題,即一個輸出到一個輸出,保持每個時間步的內部過程分開。 * 通過要求更少的權重來簡化網絡,使得一次只處理一個時間步長。 將一個更簡單的完全連接層應用于從前一層提供的序列中的每個時間步,以構建輸出序列。 ```py _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= lstm_1 (LSTM) (None, 5, 5) 140 _________________________________________________________________ time_distributed_1 (TimeDist (None, 5, 1) 6 ================================================================= Total params: 146.0 Trainable params: 146 Non-trainable params: 0.0 _________________________________________________________________ ``` 同樣,網絡學習序列。 ```py 0.0 0.2 0.4 0.6 0.8 ``` 我們可以將時間步長問題框架和TimeDistributed層視為在第一個示例中實現一對一網絡的更緊湊方式。它甚至可能在更大規模上更有效(空間或時間)。 ## 進一步閱讀 以下是您可能希望深入研究的TimeDistributed層的一些資源和討論。 * [Keras API中的TimeDistributed Layer](https://keras.io/layers/wrappers/#timedistributed) * [GitHub上的TimeDistributed](https://github.com/fchollet/keras/blob/master/keras/layers/wrappers.py#L56) 代碼 * [StackExchange上'Keras'](http://datascience.stackexchange.com/questions/10836/the-difference-between-dense-and-timedistributeddense-of-keras)的'密集'和'TimeDistributedDense'之間的區別 * [何時以及如何在GitHub上使用TimeDistributedDense](https://github.com/fchollet/keras/issues/1029) ## 摘要 在本教程中,您了解了如何為序列預測開發LSTM網絡以及TimeDistributed層的作用。 具體來說,你學到了: * 如何設計一對一的LSTM用于序列預測。 * 如何在沒有TimeDistributed Layer的情況下設計用于序列預測的多對一LSTM。 * 如何使用TimeDistributed Layer設計多對多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>

                              哎呀哎呀视频在线观看