<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 如何在使用LSTM進行訓練和預測時使用不同的批量大小 > 原文: [https://machinelearningmastery.com/use-different-batch-sizes-training-predicting-python-keras/](https://machinelearningmastery.com/use-different-batch-sizes-training-predicting-python-keras/) Keras使用快速符號數學庫作為后端,例如TensorFlow和Theano。 使用這些庫的缺點是,無論您是在訓練網絡還是進行預測,數據的形狀和大小都必須預先定義并保持不變。 在序列預測問題上,可能需要在訓練網絡時使用大批量大小,并且在進行預測時使用批量大小為1以便預測序列中的下一步驟。 在本教程中,您將了解如何解決此問題,甚至在訓練和預測期間使用不同的批量大小。 完成本教程后,您將了解: * 如何設計簡單的序列預測問題并開發LSTM來學習它。 * 如何改變在線和基于批量的學習和預測的LSTM配置。 * 如何改變用于訓練的批量大小與用于預測的批量大小。 讓我們開始吧。 ![How to use Different Batch Sizes for Training and Predicting in Python with Keras](img/fe6017057826b04e06e50385d7cc375e.jpg) 如何使用不同的批量大小進行Python的訓練和預測與Keras 照片由 [steveandtwyla](https://www.flickr.com/photos/25303648@N08/5751682588/) ,保留一些權利。 ## 教程概述 本教程分為6個部分,如下所示: 1. 批量大小 2. 序列預測問題描述 3. LSTM模型和變化的批量大小 4. 解決方案1:在線學習(批量大小= 1) 5. 解決方案2:批量預測(批量大小= N) 6. 解決方案3:復制權重 ### 教程環境 假設Python 2或3環境已安裝并正常工作。 這包括SciPy與NumPy和Pandas。必須使用TensorFlow或Keras后端安裝Keras 2.0或更高版本。 有關設置Python環境的幫助,請參閱帖子: * [如何使用Anaconda設置用于機器學習和深度學習的Python環境](http://machinelearningmastery.com/setup-python-environment-machine-learning-deep-learning-anaconda/) ## 批量大小 使用Keras的一個好處是它建立在象征性數學庫之上,如TensorFlow和Theano,可實現快速高效的計算。大型神經網絡需要這樣做。 使用這些高效庫的一個缺點是您必須預先定義數據的范圍。具體來說,批量大小。 批量大小限制在可以執行權重更新之前要顯示給網絡的樣本數。當使用擬合模型進行預測時,會施加同樣的限制。 具體而言,在擬合模型時使用的批量大小控制著您一次必須進行多少次預測。 當您希望一次進行與訓練期間使用的批量大小相同的數字預測時,這通常不是問題。 當您希望進行的預測少于批量大小時,這確實會成為一個問題。例如,您可以獲得批量較大的最佳結果,但需要在時間序列或序列問題等方面對一次觀察進行預測。 這就是為什么在將網絡擬合到訓練數據時可能需要具有與在對測試數據或新輸入數據進行預測時不同的批量大小的原因。 在本教程中,我們將探索解決此問題的不同方法。 ## 序列預測問題描述 我們將使用簡單的序列預測問題作為上下文來演示在訓練和預測之間改變批量大小的解決方案。 序列預測問題為不同的批量大小提供了一個很好的案例,因為您可能希望批量大小等于訓練期間的訓練數據集大小(批量學習),并且在對一步輸出進行預測時批量大小為1。 序列預測問題涉及學習預測以下10步序列中的下一步: ```py [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] ``` 我們可以在Python中創建這個序列,如下所示: ```py length = 10 sequence = [i/float(length) for i in range(length)] print(sequence) ``` 運行該示例打印我們的序列: ```py [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] ``` 我們必須將序列轉換為監督學習問題。這意味著當0.0顯示為輸入模式時,網絡必須學會將下一步預測為0.1。 我們可以使用Pandas _shift()_函數在Python中執行此操作,如下所示: ```py from pandas import concat from pandas import DataFrame # create sequence length = 10 sequence = [i/float(length) for i in range(length)] # create X/y pairs df = DataFrame(sequence) df = concat([df, df.shift(1)], axis=1) df.dropna(inplace=True) print(df) ``` 運行該示例顯示所有輸入和輸出對。 ```py 1 0.1 0.0 2 0.2 0.1 3 0.3 0.2 4 0.4 0.3 5 0.5 0.4 6 0.6 0.5 7 0.7 0.6 8 0.8 0.7 9 0.9 0.8 ``` 我們將使用稱為長短期記憶網絡的循環神經網絡來學習序列。因此,我們必須將輸入模式從2D數組(1列9行)轉換為由[_行,時間步長,列_]組成的3D數組,其中時間步長為1,因為我們只有一個時間步長觀察每一行。 我們可以使用NumPy函數 _reshape()_執行此操作,如下所示: ```py from pandas import concat from pandas import DataFrame # create sequence length = 10 sequence = [i/float(length) for i in range(length)] # create X/y pairs df = DataFrame(sequence) df = concat([df, df.shift(1)], 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) print(X.shape, y.shape) ``` 運行該示例創建 _X_ 和 _y_ 陣列,準備與LSTM一起使用并打印其形狀。 ```py (9, 1, 1) (9,) ``` ## LSTM模型和變化的批量大小 在本節中,我們將針對該問題設計LSTM網絡。 訓練批量大小將覆蓋整個訓練數據集(批量學習),并且將一次一個地進行預測(一步預測)。我們將證明雖然模型能夠解決問題,但一步預測會導致錯誤。 我們將使用適合1000個時期的LSTM網絡。 權重將在每個訓練時期結束時更新(批量學習),這意味著批量大小將等于訓練觀察的數量(9)。 對于這些實驗,我們將需要對LSTM的內部狀態何時更新進行細粒度控制。通常LSTM狀態在Keras的每個批次結束時被清除,但是我們可以通過使LSTM有狀態并且調用 _model.reset_state()_來手動管理該狀態來控制它。這將在后面的章節中提到。 網絡有一個輸入,一個隱藏層有10個單元,一個輸出層有1個單元。默認的tanh激活函數用于LSTM單元,而線性激活函數用于輸出層。 使用有效的ADAM優化算法將均方誤差優化函數用于該回歸問題。 以下示例配置并創建網絡。 ```py # configure network n_batch = len(X) n_epoch = 1000 n_neurons = 10 # design network model = Sequential() model.add(LSTM(n_neurons, batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') ``` 我們將網絡適合每個時期的所有示例,并在每個時期結束時手動重置網絡狀態。 ```py # fit network for i in range(n_epoch): model.fit(X, y, epochs=1, batch_size=n_batch, verbose=1, shuffle=False) model.reset_states() ``` 最后,我們將一次預測序列中的每個步驟。 這需要批量大小為1,這與用于適合網絡的批量大小9不同,并且在運行示例時將導致錯誤。 ```py # online forecast for i in range(len(X)): testX, testy = X[i], y[i] testX = testX.reshape(1, 1, 1) yhat = model.predict(testX, batch_size=1) print('>Expected=%.1f, Predicted=%.1f' % (testy, yhat)) ``` 下面是完整的代碼示例。 ```py 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)] # create X/y pairs df = DataFrame(sequence) df = concat([df, df.shift(1)], 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) # configure network n_batch = len(X) n_epoch = 1000 n_neurons = 10 # design network model = Sequential() model.add(LSTM(n_neurons, batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') # fit network for i in range(n_epoch): model.fit(X, y, epochs=1, batch_size=n_batch, verbose=1, shuffle=False) model.reset_states() # online forecast for i in range(len(X)): testX, testy = X[i], y[i] testX = testX.reshape(1, 1, 1) yhat = model.predict(testX, batch_size=1) print('>Expected=%.1f, Predicted=%.1f' % (testy, yhat)) ``` 運行該示例可以很好地匹配模型,并在進行預測時導致錯誤。 報告的錯誤如下: ```py ValueError: Cannot feed value of shape (1, 1, 1) for Tensor 'lstm_1_input:0', which has shape '(9, 1, 1)' ``` ## 解決方案1:在線學習(批量大小= 1) 該問題的一個解決方案是使用在線學習來擬合模型。 這是批量大小設置為值1并且在每個訓練示例之后更新網絡權重的位置。 這可以具有更快學習的效果,但也會增加學習過程的不穩定性,因為權重隨著每批次而變化很大。 盡管如此,這將使我們能夠對問題進行一步預測。唯一需要做的更改是將 _n_batch_ 設置為1,如下所示: ```py n_batch = 1 ``` 完整的代碼清單如下。 ```py 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)] # create X/y pairs df = DataFrame(sequence) df = concat([df, df.shift(1)], 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) # configure network n_batch = 1 n_epoch = 1000 n_neurons = 10 # design network model = Sequential() model.add(LSTM(n_neurons, batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') # fit network for i in range(n_epoch): model.fit(X, y, epochs=1, batch_size=n_batch, verbose=1, shuffle=False) model.reset_states() # online forecast for i in range(len(X)): testX, testy = X[i], y[i] testX = testX.reshape(1, 1, 1) yhat = model.predict(testX, batch_size=1) print('>Expected=%.1f, Predicted=%.1f' % (testy, yhat)) ``` 運行該示例將打印9個預期結果和正確的預測。 ```py >Expected=0.0, Predicted=0.0 >Expected=0.1, Predicted=0.1 >Expected=0.2, Predicted=0.2 >Expected=0.3, Predicted=0.3 >Expected=0.4, Predicted=0.4 >Expected=0.5, Predicted=0.5 >Expected=0.6, Predicted=0.6 >Expected=0.7, Predicted=0.7 >Expected=0.8, Predicted=0.8 ``` ## 解決方案2:批量預測(批量大小= N) 另一種解決方案是批量生產所有預測。 這意味著我們在模型使用方式上可能非常有限。 我們必須立即使用所有預測,或者只保留第一個預測并丟棄其余的預測。 我們可以通過預測批量大小等于訓練批量大小來調整批量預測的示例,然后枚舉預測批次,如下所示: ```py # batch forecast yhat = model.predict(X, batch_size=n_batch) for i in range(len(y)): print('>Expected=%.1f, Predicted=%.1f' % (y[i], yhat[i])) ``` 下面列出了完整的示例。 ```py 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)] # create X/y pairs df = DataFrame(sequence) df = concat([df, df.shift(1)], 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) # configure network n_batch = len(X) n_epoch = 1000 n_neurons = 10 # design network model = Sequential() model.add(LSTM(n_neurons, batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') # fit network for i in range(n_epoch): model.fit(X, y, epochs=1, batch_size=n_batch, verbose=1, shuffle=False) model.reset_states() # batch forecast yhat = model.predict(X, batch_size=n_batch) for i in range(len(y)): print('>Expected=%.1f, Predicted=%.1f' % (y[i], yhat[i])) ``` 運行該示例將打印預期和正確的預測值。 ```py >Expected=0.0, Predicted=0.0 >Expected=0.1, Predicted=0.1 >Expected=0.2, Predicted=0.2 >Expected=0.3, Predicted=0.3 >Expected=0.4, Predicted=0.4 >Expected=0.5, Predicted=0.5 >Expected=0.6, Predicted=0.6 >Expected=0.7, Predicted=0.7 >Expected=0.8, Predicted=0.8 ``` ## 解決方案3:復制權重 更好的解決方案是使用不同的批量大小進行訓練和預測。 執行此操作的方法是從擬合網絡復制權重,并使用預先訓練的權重創建新網絡。 我們可以使用Keras API中的 _get_weights()_和 _set_weights()_函數輕松完成此操作,如下所示: ```py # re-define the batch size n_batch = 1 # re-define model new_model = Sequential() new_model.add(LSTM(n_neurons, batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True)) new_model.add(Dense(1)) # copy weights old_weights = model.get_weights() new_model.set_weights(old_weights) ``` 這將創建一個以批量大小為1編譯的新模型。然后,我們可以使用此新模型進行一步預測: ```py # online forecast for i in range(len(X)): testX, testy = X[i], y[i] testX = testX.reshape(1, 1, 1) yhat = new_model.predict(testX, batch_size=n_batch) print('>Expected=%.1f, Predicted=%.1f' % (testy, yhat)) ``` The complete example is listed below. ```py 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)] # create X/y pairs df = DataFrame(sequence) df = concat([df, df.shift(1)], 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) # configure network n_batch = 3 n_epoch = 1000 n_neurons = 10 # design network model = Sequential() model.add(LSTM(n_neurons, batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') # fit network for i in range(n_epoch): model.fit(X, y, epochs=1, batch_size=n_batch, verbose=1, shuffle=False) model.reset_states() # re-define the batch size n_batch = 1 # re-define model new_model = Sequential() new_model.add(LSTM(n_neurons, batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True)) new_model.add(Dense(1)) # copy weights old_weights = model.get_weights() new_model.set_weights(old_weights) # compile model new_model.compile(loss='mean_squared_error', optimizer='adam') # online forecast for i in range(len(X)): testX, testy = X[i], y[i] testX = testX.reshape(1, 1, 1) yhat = new_model.predict(testX, batch_size=n_batch) print('>Expected=%.1f, Predicted=%.1f' % (testy, yhat)) ``` 運行該示例將打印預期的值,并再次正確預測值。 ```py >Expected=0.0, Predicted=0.0 >Expected=0.1, Predicted=0.1 >Expected=0.2, Predicted=0.2 >Expected=0.3, Predicted=0.3 >Expected=0.4, Predicted=0.4 >Expected=0.5, Predicted=0.5 >Expected=0.6, Predicted=0.6 >Expected=0.7, Predicted=0.7 >Expected=0.8, Predicted=0.8 ``` ## 摘要 在本教程中,您了解了如何通過相同的網絡來改變用于訓練和預測的批量大小的需求。 具體來說,你學到了: * 如何設計簡單的序列預測問題并開發LSTM來學習它。 * 如何改變在線和基于批量的學習和預測的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>

                              哎呀哎呀视频在线观看