何时以及在哪里使用这些Keras LSTM模型

我知道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, Bidirectionalfrom keras.models import Sequentialfrom keras.layers.wrappers import TimeDistributed#model1model1 = 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()#model2model2 = 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()#model3model3 = 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()#model4model4 = 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()#model5model5 = 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或最大池化),从概念上看它们非常相似。

  2. 第二个网络 – 从设计角度来看与第一个架构非常相似。它们的区别在于,在第一个方法中,两个连续的fitpredict调用是完全独立的,而在这里 – 第二次调用的初始状态与第一次调用的最后状态相同。这使得许多有趣的场景成为可能,例如分析不同长度的序列或决策过程,因为你可以有效地停止推理/训练过程 – 影响网络或输入,然后以更新的状态返回到它。

  3. 当你不想在计算的各个阶段都使用循环网络时,这是最好的选择。特别是 – 当你的网络很大时 – 引入循环层在参数数量方面是相当昂贵的(引入循环连接通常至少会使参数数量增加两倍)。所以你可以将静态网络作为预处理阶段 – 然后将结果输入到循环部分。这使得训练变得更容易。

  4. 模型是第3种情况的特殊情况。在这里 – 你有一系列通过one-hot编码编码的标记,然后使用Embedding进行转换。这使得过程占用的内存更少。

  5. 双向网络为你提供了一个优势,即在每个步骤不仅知道序列的前一个历史 – 还知道后续步骤。这是以计算成本为代价的,而且你也失去了顺序数据输入的可能性 – 因为进行分析时你需要拥有完整的序列。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注