何时以及在哪里使用这些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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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