我们应该何时何地使用这些 keras LSTM 模型

When and where should we use these keras LSTM models

我知道 RNN、LSTM、神经网络、激活函数是如何工作的,但是从各种可用的 LSTM 模型中我不知道我应该在什么时候使用什么数据。我创建了这 5 个模型作为我见过的不同 LSTM 模型的样本,但我不知道应该使用哪个最佳序列数据集。我对这些模型的 second/third 行很困惑。 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()

所以:

  1. 第一个网络最适合分类。它只是分析整个序列——一旦所有输入步骤都被输入到模型中——它就能够做出决定。这种架构还有其他变体(例如使用 GlobalAveragePooling1D 或 max one),从概念的角度来看它们非常相似。

  2. 第二个网络——从设计的角度来看与第一个架构非常相似。它们的不同之处在于,在第一种方法中,两个随后的 fitpredict 调用是完全独立的,而这里 - 第二次调用的起始状态与第一次调用中的最后一个调用相同。这可以实现很多很酷的场景,例如变长序列分析或例如由于您可以有效地停止推理/训练过程 - 影响网络或输入并以实际状态返回它,因此决策过程。

  3. 当您不想在计算的所有阶段都使用循环网络时,这是最好的选择。特别是-当您的网络很大时-从参数数量的角度来看,引入循环层的成本非常高(引入循环连接通常会使参数数量增加至少 2 倍)。因此,您可以应用静态网络作为预处理阶段——然后将结果提供给循环部分。这使训练更容易。

  4. 模型是情况 3 的特例。这里 - 您有一系列标记,这些标记由单热编码编码,然后使用 Embedding 进行转换。这使得进程消耗的内存更少。

  5. 双向网络的优势在于,您不仅可以了解每一步的历史序列,还可以了解后续步骤。这是以计算成本为代价的,而且您正在失去顺序数据馈送的可能性 - 因为在执行分析时您需要具有完整的序列。