Keras:LSTM和GRU示例


Keras:LSTM和GRU示例

長短期記憶網絡(LSTM)是一種循環神經網絡體系結構,解決了不同網絡執行之間的梯度消失問題。LSTM是由Sepp Hochreiter和Jurger Schmidhuber在1997年開發的,本質上是為網絡添加了一個優先通道,稱為單元狀態或存儲單元,該通道與網絡信號並行傳輸並存儲序列信息。

在本文中,我們將使用LSTM改進神經網絡,以在IMDB電影評論數據集上訓練情感分析。

<code>from time import timeimport numpy as npimport matplotlib.pyplot as pltfrom keras.utils import to_categoricalfrom keras.models import Sequentialfrom keras.layers import Dense/<code>

機器學習數據集

我們使用Keras加載imdb機器學習數據集,將其限制為10000個最常用的單詞。

<code>from keras.datasets import imdb num_words = 10000(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=num_words)print("Number of exemples train set: %d" % len(X_train))print("Number of exemples test set: %d" % len(X_test))/<code>
Keras:LSTM和GRU示例

預處理數據

文本語料庫中的評論顯然具有不同的長度,我們使用keras的pad_sequences函數將序列限制為500個元素(在我們的情況下為500個單詞)。如果一個序列的示例數少於500,則將在末尾添加零

<code>from keras.preprocessing.sequence import pad_sequencesmaxlen = 500X_train = pad_sequences(X_train, maxlen = maxlen)X_test = pad_sequences(X_test, maxlen = maxlen)/<code>

我們創建LSTM模型

我們以這種方式建立機器學習模型:

第一層將為字典中的10,000個單詞創建50個嵌入向量。

第二層是循環長短期記憶層。

第三層計算網絡輸出,為二分類問題,激活函數為sigmoid。

<code>from keras.layers import Embedding, LSTMmodel = Sequential()model.add(Embedding(num_words, 50))model.add(LSTM(32))model.add(Dense(1, activation='sigmoid'))/<code>

我們擬合機器學習模型並訓練5個epochs。

<code>model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])model.fit(X_train, y_train, batch_size=512, validation_split=0.2, epochs=5)model.evaluate(X_test, y_test)/<code>
Keras:LSTM和GRU示例

結果比簡單的RNN好得多,存在一些過擬合現象,讓我們嘗試使用dropout對其進行校正。

RNN中的Dropout

要在循環層的輸入上使用dropout,而不是使用dropout類,建議使用SimpleRNN和LSTM類的dropout參數。要使用recurrent dropout,可以使用SimpleRNN和LSTM類的recurrent_dropout參數

<code>from keras.layers import Embedding, LSTM, Dropoutmodel = Sequential()model.add(Embedding(num_words, 50))model.add(LSTM(32, dropout=0.4, recurrent_dropout=0.2))model.add(Dropout(0.4))model.add(Dense(1, activation='sigmoid'))/<code>

我們擬合機器學習模型並訓練5個epochs

<code>model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])model.fit(X_train, y_train, batch_size=512, validation_split=0.2, epochs=5)model.evaluate(X_test, y_test)/<code>
Keras:LSTM和GRU示例

我們減少了網絡中的過度擬合,現在我們嘗試通過向網絡中添加其他層來改進神經網絡模型。

讓我們添加更多的LSTM層

我們可以使用Sequential類的add方法將其他循環層添加到網絡中。默認情況下,LSTM類flattens序列,將其作為dense層的輸入,我們可以通過將return_sequences參數設置為True來更改此行為。

<code>from keras.layers import Embedding, LSTM, Dropoutmodel = Sequential()model.add(Embedding(num_words, 100))model.add(LSTM(32, dropout=0.5, recurrent_dropout=0.2, return_sequences=True))model.add(LSTM(32, dropout=0.5, recurrent_dropout=0.2))model.add(Dropout(0.5))model.add(Dense(1, activation='sigmoid'))model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])start_at = time()model.fit(X_train, y_train, batch_size=512, validation_split=0.2, epochs=5)model.evaluate(X_test, y_test)/<code>
Keras:LSTM和GRU示例

門控循環單元(GRU)

門控循環單元(GRU)是一種循環神經網絡,可從LSTM中獲取提示並對其進行簡化。與LSTM不同,門控循環單元(GRU)需要較少的張量計算,因此通常可以在更短的時間內得到相似的結果。我們可以通過GRU類在Keras中添加GRU層,讓我們使用與深層LSTM網絡相同的架構來實現它。

<code>from keras.layers import Embedding, GRU, Dropoutmodel = Sequential()model.add(Embedding(num_words, 100))model.add(GRU(32, dropout=0.5, recurrent_dropout=0.2, return_sequences=True))model.add(GRU(32, dropout=0.5, recurrent_dropout=0.2))model.add(Dropout(0.5))model.add(Dense(1, activation='sigmoid'))model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])start_at = time()model.fit(X_train, y_train, batch_size=512, validation_split=0.2, epochs=5)model.evaluate(X_test, y_test)/<code>
Keras:LSTM和GRU示例

結果明顯低於LSTM,但訓練時間減少了20%。


分享到:


相關文章: