2017-07-07 49 views
3

我知道RNN,LSTM,神經網絡激活函數是如何工作的,但是來自各種可用的LSTM模型我不知道我應該使用哪些數據和何時。我創建了這5個模型作爲我已經看到的不同的LSTM模型變量的樣本,但我不知道應該使用哪個最佳序列數據集。我在這些模型的第二/第三行中擁有大部分的信息。 model1和model4是一樣的嗎?爲什麼model1.add(LSTM(10, input_shape=(max_len, 1), return_sequences=False))model4.add(Embedding(X_train.shape[1], 128, input_length=max_len))不同。如果有人能用簡單的英語解釋這五種模型,我會非常感激。何時何地應該使用這些keras LSTM模型

from keras.layers import Dense, Dropout, Embedding, LSTM, Bidirectional 
from keras.models import Sequential 
from keras.layers.wrappers import TimeDistributed 

#model1 
model1 = Sequential() 
model1.add(LSTM(10, input_shape=(max_len, 1), return_sequences=False)) 
model1.add(Dense(1, activation='sigmoid')) 
model1.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 

print model1.summary() 

#model2 
model2 = Sequential() 
model2.add(LSTM(10, batch_input_shape=(1, 1, 1), return_sequences=False, stateful=True)) 
model2.add(Dense(1, activation='sigmoid')) 
model2.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 

print model2.summary() 


#model3 
model3 = Sequential() 
model3.add(TimeDistributed(Dense(X_train.shape[1]), input_shape=(X_train.shape[1],1))) 
model3.add(LSTM(10, return_sequences=False)) 
model3.add(Dense(1, activation='sigmoid')) 
model3.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 

print model3.summary() 


#model4 
model4 = Sequential() 
model4.add(Embedding(X_train.shape[1], 128, input_length=max_len)) 
model4.add(LSTM(10)) 
model4.add(Dense(1, activation='sigmoid')) 
model4.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 

print model4.summary() 

#model5 
model5 = Sequential() 
model5.add(Embedding(X_train.shape[1], 128, input_length=max_len)) 
model5.add(Bidirectional(LSTM(10))) 
model5.add(Dense(1, activation='sigmoid')) 
model5.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 

print model5.summary() 

回答

1

所以:

  1. 第一網絡是一個分類的最好的之一。它只是分析整個序列 - 並且一旦所有輸入步驟都被輸入到一個模型中,它就能夠做出決定。此架構還有其他變體(例如使用GlobalAveragePooling1D或最大一個),從概念的角度來看,它們非常相似。

  2. 第二個網絡 - 從設計角度來看,與第一個架構非常相似。與第一種方法不同的是,在第一種方法中,兩個結果fitpredict調用是完全獨立的,而這裏 - 第二個調用的起始狀態與第一個調用的最後一個相同。這使得很多很酷的場景例如變化的長度序列分析或例如決策過程得益於您可以有效地停止推理/培訓過程 - 影響網絡或輸入並回到實際狀態。

  3. 當您不想在計算的各個階段使用循環網絡時,是最好的選擇。特別是 - 當你的網絡很大時 - 從參數數量的角度來看,引入一個循環圖層是相當昂貴的(引入一個循環連接通常會使參數數量增加至少2倍)。因此,您可以將靜態網絡應用爲預處理階段 - 然後將結果輸入到經常性部分。這使得訓練更容易。

  4. 模型是案例3的一個特例。這裏 - 您有一個令牌序列,它們由單熱編碼編碼,然後使用Embedding進行轉換。這使得進程減少了內存消耗。

  5. Bidrectional網絡爲您提供了一個優點,即在每一步中不僅可以瞭解先前的歷史順序,還可以瞭解更多步驟。這是以計算成本計算的,而且您正在失去順序數據饋送的可能性 - 因爲執行分析時需要具有完整序列。