<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之旅 廣告
                # 用 Keras 進行 Python 中 LSTM 循環神經網絡的序列分類 > 原文: [https://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/](https://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/) 序列分類是一種預測建模問題,您可以在空間或時間上獲得一些輸入序列,任務是預測序列的類別。 使這個問題困難的原因是序列的長度可以變化,由輸入符號的非常大的詞匯表組成,并且可能要求模型學習輸入序列中的符號之間的長期上下文或依賴性。 在這篇文章中,您將了解如何使用 Keras 深度學習庫為 Python 中的序列分類問題開發 LSTM 循環神經網絡模型。 閱讀這篇文章后你會知道: * 如何為序列分類問題開發 LSTM 模型。 * 如何通過使用壓差來減少 LSTM 模型中的過度擬合。 * 如何將 LSTM 模型與擅長學習空間關系的卷積神經網絡相結合。 讓我們開始吧。 * **2016 年 10 月更新**:更新了 Keras 1.1.0 和 TensorFlow 0.10.0 的示例。 * **2017 年 3 月更新**:更新了 Keras 2.0.2,TensorFlow 1.0.1 和 Theano 0.9.0 的示例。 * **更新 May / 2018** :更新了使用最新 Keras API 的代碼,感謝 jeremy rutman。 ![Sequence Classification with LSTM Recurrent Neural Networks in Python with Keras](img/0f56cceecbb4dedba0833021799047d2.jpg) 用 Keras 用 Python 中的 LSTM 循環神經網絡進行序列分類 [photophilde](https://www.flickr.com/photos/photophilde/4875287879/) ,保留一些權利。 ## 問題描述 我們將在本教程中用于演示序列學習的問題是 [IMDB 電影評論情感分類問題](http://ai.stanford.edu/~amaas/data/sentiment/)。每個電影評論是一個可變的單詞序列,每個電影評論的情感必須分類。 大型電影評論數據集(通常稱為 IMDB 數據集)包含 25,000 個用于訓練的高極電影評論(好或壞),并且再次用于測試。問題是確定給定的電影評論是否具有積極或消極的情感。 這些數據由[斯坦福研究人員收集并用于 2011 年的論文](http://ai.stanford.edu/~amaas/papers/wvSent_acl2011.pdf),其中 50-50 的數據被用于訓練和測試。準確度達到 88.89%。 Keras 提供對內置 IMDB 數據集的訪問。 **imdb.load_data()**函數允許您以準備好在神經網絡和深度學習模型中使用的格式加載數據集。 單詞已被整數替換,這些整數表示數據集中每個單詞的有序頻率。因此,每個評論中的句子由一系列整數組成。 ### 單詞嵌入 我們將每個電影評論映射到一個真正的向量域,這是一種處理文字的流行技術,稱為文字嵌入。這是一種在高維空間中將單詞編碼為實值向量的技術,其中單詞之間的意義相似性轉換為向量空間中的接近度。 Keras 提供了一種方便的方法,可以將單詞的正整數表示轉換為嵌入層的單詞嵌入。 我們將每個單詞映射到 32 長度的實值向量上。我們還將對建模感興趣的單詞總數限制為 5000 個最常用的單詞,其余為零。最后,每個評論中的序列長度(單詞數量)各不相同,因此我們將每個評論限制為 500 個單詞,截斷長評論并用零值填充較短的評論。 現在我們已經定義了我們的問題以及如何準備和建模數據,我們已經準備好開發 LSTM 模型來對電影評論的情感進行分類。 ## 用于序列分類的簡單 LSTM 我們可以快速開發用于 IMDB 問題的小型 LSTM 并獲得良好的準確性。 讓我們首先導入此模型所需的類和函數,并將隨機數生成器初始化為常量值,以確保我們可以輕松地重現結果。 ```py import numpy from keras.datasets import imdb from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from keras.layers.embeddings import Embedding from keras.preprocessing import sequence # fix random seed for reproducibility numpy.random.seed(7) ``` 我們需要加載 IMDB 數據集。我們將數據集限制在前 5,000 個單詞中。我們還將數據集拆分為 train(50%)和 test(50%)集。 ```py # load the dataset but only keep the top n words, zero the rest top_words = 5000 (X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words) ``` 接下來,我們需要截斷并填充輸入序列,以便它們具有相同的建模長度。模型將學習零值不攜帶信息,因此實際上序列在內容方面不是相同的長度,但是在 Keras 中執行計算需要相同的長度向量。 ```py # truncate and pad input sequences max_review_length = 500 X_train = sequence.pad_sequences(X_train, maxlen=max_review_length) X_test = sequence.pad_sequences(X_test, maxlen=max_review_length) ``` 我們現在可以定義,編譯和擬合我們的 LSTM 模型。 第一層是嵌入層,它使用 32 個長度向量來表示每個單詞。下一層是具有 100 個內存單元(智能神經元)的 LSTM 層。最后,因為這是一個分類問題,我們使用具有單個神經元和 S 形激活函數的密集輸出層來對問題中的兩個類(好的和壞的)進行 0 或 1 個預測。 因為它是二元分類問題,所以使用對數丟失作為損失函數(Keras 中的 **binary_crossentropy** )。使用有效的 ADAM 優化算法。該模型僅適用于 2 個時期,因為它很快就能解決問題。 64 個評論的大批量用于分隔重量更新。 ```py # create the model embedding_vecor_length = 32 model = Sequential() model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length)) model.add(LSTM(100)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) print(model.summary()) model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=3, batch_size=64) ``` 一旦適合,我們估計模型在看不見的評論上的表現。 ```py # Final evaluation of the model scores = model.evaluate(X_test, y_test, verbose=0) print("Accuracy: %.2f%%" % (scores[1]*100)) ``` 為了完整性,以下是 IMDB 數據集上此 LSTM 網絡的完整代碼清單。 ```py # LSTM for sequence classification in the IMDB dataset import numpy from keras.datasets import imdb from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from keras.layers.embeddings import Embedding from keras.preprocessing import sequence # fix random seed for reproducibility numpy.random.seed(7) # load the dataset but only keep the top n words, zero the rest top_words = 5000 (X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words) # truncate and pad input sequences max_review_length = 500 X_train = sequence.pad_sequences(X_train, maxlen=max_review_length) X_test = sequence.pad_sequences(X_test, maxlen=max_review_length) # create the model embedding_vecor_length = 32 model = Sequential() model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length)) model.add(LSTM(100)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) print(model.summary()) model.fit(X_train, y_train, epochs=3, batch_size=64) # Final evaluation of the model scores = model.evaluate(X_test, y_test, verbose=0) print("Accuracy: %.2f%%" % (scores[1]*100)) ``` 運行此示例將生成以下輸出。 請注意,如果您使用的是 TensorFlow 后端,您可能會看到一些與“PoolAllocator”相關的警告消息,您現在可以忽略這些消息。 ```py Epoch 1/3 16750/16750 [==============================] - 107s - loss: 0.5570 - acc: 0.7149 Epoch 2/3 16750/16750 [==============================] - 107s - loss: 0.3530 - acc: 0.8577 Epoch 3/3 16750/16750 [==============================] - 107s - loss: 0.2559 - acc: 0.9019 Accuracy: 86.79% ``` 您可以看到,這種簡單的 LSTM 幾乎沒有調整,可以在 IMDB 問題上獲得最接近的最新結果。重要的是,這是一個模板,您可以使用該模板將 LSTM 網絡應用于您自己的序列分類問題。 現在,讓我們看一下這個簡單模型的一些擴展,您可能也希望將這些擴展帶給您自己的問題。 ## LSTM 用于帶有 Dropout 的序列分類 像 LSTM 這樣的循環神經網絡通常具有過度擬合的問題。 可以使用 Dropout Keras 層在層之間應用 Dropout。我們可以通過在 Embedding 和 LSTM 層以及 LSTM 和 Dense 輸出層之間添加新的 Dropout 層來輕松完成此操作。例如: ```py model = Sequential() model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length)) model.add(Dropout(0.2)) model.add(LSTM(100)) model.add(Dropout(0.2)) model.add(Dense(1, activation='sigmoid')) ``` 上面添加了 Dropout 層的完整代碼列表示例如下: ```py # LSTM with Dropout for sequence classification in the IMDB dataset import numpy from keras.datasets import imdb from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from keras.layers import Dropout from keras.layers.embeddings import Embedding from keras.preprocessing import sequence # fix random seed for reproducibility numpy.random.seed(7) # load the dataset but only keep the top n words, zero the rest top_words = 5000 (X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words) # truncate and pad input sequences max_review_length = 500 X_train = sequence.pad_sequences(X_train, maxlen=max_review_length) X_test = sequence.pad_sequences(X_test, maxlen=max_review_length) # create the model embedding_vecor_length = 32 model = Sequential() model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length)) model.add(Dropout(0.2)) model.add(LSTM(100)) model.add(Dropout(0.2)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) print(model.summary()) model.fit(X_train, y_train, epochs=3, batch_size=64) # Final evaluation of the model scores = model.evaluate(X_test, y_test, verbose=0) print("Accuracy: %.2f%%" % (scores[1]*100)) ``` 運行此示例提供以下輸出。 ```py Epoch 1/3 16750/16750 [==============================] - 108s - loss: 0.5802 - acc: 0.6898 Epoch 2/3 16750/16750 [==============================] - 108s - loss: 0.4112 - acc: 0.8232 Epoch 3/3 16750/16750 [==============================] - 108s - loss: 0.3825 - acc: 0.8365 Accuracy: 85.56% ``` 我們可以看到dropout對訓練產生了預期的影響,收斂趨勢略微緩慢,在這種情況下,最終的準確性較低。該模型可能會使用更多的訓練時代,并可能獲得更高的技能(試試看)。 或者,可以使用 LSTM 精確地和單獨地將壓差應用于存儲器單元的輸入和循環連接。 Keras 通過 LSTM 層上的參數提供此功能,**丟失**用于配置輸入丟失, **recurrent_dropout** 用于配置重復丟失。例如,我們可以修改第一個示例,將 dropout 添加到輸入和循環連接,如下所示: ```py model = Sequential() model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length)) model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2)) model.add(Dense(1, activation='sigmoid')) ``` 下面列出了具有更精確 LSTM 丟失的完整代碼清單,以確保完整性。 ```py # LSTM with dropout for sequence classification in the IMDB dataset import numpy from keras.datasets import imdb from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from keras.layers.embeddings import Embedding from keras.preprocessing import sequence # fix random seed for reproducibility numpy.random.seed(7) # load the dataset but only keep the top n words, zero the rest top_words = 5000 (X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words) # truncate and pad input sequences max_review_length = 500 X_train = sequence.pad_sequences(X_train, maxlen=max_review_length) X_test = sequence.pad_sequences(X_test, maxlen=max_review_length) # create the model embedding_vecor_length = 32 model = Sequential() model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length)) model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) print(model.summary()) model.fit(X_train, y_train, epochs=3, batch_size=64) # Final evaluation of the model scores = model.evaluate(X_test, y_test, verbose=0) print("Accuracy: %.2f%%" % (scores[1]*100)) ``` 運行此示例提供以下輸出。 ```py Epoch 1/3 16750/16750 [==============================] - 112s - loss: 0.6623 - acc: 0.5935 Epoch 2/3 16750/16750 [==============================] - 113s - loss: 0.5159 - acc: 0.7484 Epoch 3/3 16750/16750 [==============================] - 113s - loss: 0.4502 - acc: 0.7981 Accuracy: 82.82% ``` 我們可以看到,LSTM 特定的丟失對網絡的收斂具有比逐層丟失更明顯的影響。如上所述,時期的數量保持不變并且可以增加以查看模型的技能是否可以進一步提升。 Dropout 是一種強大的技術,用于對抗 LSTM 模型中的過度擬合,并且嘗試這兩種方法是個好主意,但是您可以使用 Keras 中提供的特定于門的丟失來獲得更好的結果。 ## 用于序列分類的 LSTM 和卷積神經網絡 卷積神經網絡在學習輸入數據的空間結構方面表現出色。 IMDB 評論數據確實在評論中的單詞序列中具有一維空間結構,并且 CNN 可能能夠針對良好和不良情感挑選不變特征。然后,可以通過 LSTM 層將該學習的空間特征學習為序列。 我們可以在嵌入層之后輕松添加一維 CNN 和最大池池,然后將合并的特征提供給 LSTM。我們可以使用一小組 32 個特征,濾波器長度為 3 小。池化層可以使用標準長度 2 來將特征映射大小減半。 例如,我們將按如下方式創建模型: ```py model = Sequential() model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length)) model.add(Conv1D(filters=32, kernel_size=3, padding='same', activation='relu')) model.add(MaxPooling1D(pool_size=2)) model.add(LSTM(100)) model.add(Dense(1, activation='sigmoid')) ``` 下面列出了具有 CNN 和 LSTM 層的完整代碼清單,以確保完整性。 ```py # LSTM and CNN for sequence classification in the IMDB dataset import numpy from keras.datasets import imdb from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from keras.layers.convolutional import Conv1D from keras.layers.convolutional import MaxPooling1D from keras.layers.embeddings import Embedding from keras.preprocessing import sequence # fix random seed for reproducibility numpy.random.seed(7) # load the dataset but only keep the top n words, zero the rest top_words = 5000 (X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words) # truncate and pad input sequences max_review_length = 500 X_train = sequence.pad_sequences(X_train, maxlen=max_review_length) X_test = sequence.pad_sequences(X_test, maxlen=max_review_length) # create the model embedding_vecor_length = 32 model = Sequential() model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length)) model.add(Conv1D(filters=32, kernel_size=3, padding='same', activation='relu')) model.add(MaxPooling1D(pool_size=2)) model.add(LSTM(100)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) print(model.summary()) model.fit(X_train, y_train, epochs=3, batch_size=64) # Final evaluation of the model scores = model.evaluate(X_test, y_test, verbose=0) print("Accuracy: %.2f%%" % (scores[1]*100)) ``` 運行此示例提供以下輸出。 ```py Epoch 1/3 16750/16750 [==============================] - 58s - loss: 0.5186 - acc: 0.7263 Epoch 2/3 16750/16750 [==============================] - 58s - loss: 0.2946 - acc: 0.8825 Epoch 3/3 16750/16750 [==============================] - 58s - loss: 0.2291 - acc: 0.9126 Accuracy: 86.36% ``` 我們可以看到,我們獲得了與第一個示例類似的結果,盡管權重更小,訓練時間更短。 如果將此示例進一步擴展為使用 dropout,我希望可以實現更好的結果。 ## 資源 如果您有興趣深入了解序列預測或這個具體的例子,下面是一些資源。 * [LSTM 的 Theano 教程應用于 IMDB 數據集](http://deeplearning.net/tutorial/lstm.html) * 在 IMDB 數據集上使用 [LSTM 和 CNN](https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py) 和 [LSTM 的 Keras 代碼示例。](https://github.com/fchollet/keras/blob/master/examples/imdb_cnn_lstm.py) * [監督序列標記與循環神經網絡](http://www.amazon.com/dp/3642247962?tag=inspiredalgor-20),2012 年由 Alex Graves([和 PDF 預打印](https://www.cs.toronto.edu/~graves/preprint.pdf))出版。 ## 摘要 在這篇文章中,您了解了如何為序列分類預測建模問題開發 LSTM 網絡模型。 具體來說,你學到了: * 如何為 IMDB 電影評論情感分類問題開發一個簡單的單層 LSTM 模型。 * 如何使用分層和 LSTM 特定的壓差擴展 LSTM 模型以減少過度擬合。 * 如何將卷積神經網絡的空間結構學習特性與 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>

                              哎呀哎呀视频在线观看