我知道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))
不同。如果有人能用简单的英语解释这五个模型,我将不胜感激。
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()
答案 0 :(得分:1)
所以:
第一个网络是最好的分类网络。它只是简单地分析整个序列 - 一旦所有输入步骤都被输入模型 - 它就能够做出决定。从概念的角度来看,这种架构的其他变体(使用例如GlobalAveragePooling1D
或max one)非常类似。
第二个网络 - 从设计的角度来看与第一个架构非常相似。它们的不同之处在于,在第一种方法中,两个随后的fit
和predict
调用是完全独立的,而在这里 - 第二次调用的起始状态与第一次调用中的最后一个相同。这可以实现许多很酷的场景,例如:变长序列分析或例如由于您可以有效地停止推理/培训过程 - 影响网络或输入并以实际状态返回到它,因此决策制定过程。
当您不想在计算的所有阶段使用经常性网络时,这是最好的。特别是 - 当您的网络很大时 - 从参数编号的角度来看,引入循环层是非常昂贵的(引入循环连接通常会使参数数量增加至少2倍)。因此,您可以将静态网络应用为预处理阶段 - 然后将结果提供给周期性部分。这使培训更容易。
模型是案例3的特例。这里 - 您有一系列令牌,这些令牌通过单热编码进行编码,然后使用Embedding
进行转换。这使得该过程减少了内存消耗。
双向网络为您提供了一个优势,即每个步骤不仅可以了解序列以前的历史记录,还可以了解更多步骤。这是计算成本,并且您正在失去顺序数据馈送的可能性 - 因为您需要在执行分析时拥有完整序列。