我知道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()
回答:
因此:
-
第一个网络是最适合分类的。它简单地分析整个序列 – 一旦所有输入步骤都被输入到模型中 – 它就能够做出决策。还有其他变体(例如使用
GlobalAveragePooling1D
或最大池化),从概念上看它们非常相似。 -
第二个网络 – 从设计角度来看与第一个架构非常相似。它们的区别在于,在第一个方法中,两个连续的
fit
和predict
调用是完全独立的,而在这里 – 第二次调用的初始状态与第一次调用的最后状态相同。这使得许多有趣的场景成为可能,例如分析不同长度的序列或决策过程,因为你可以有效地停止推理/训练过程 – 影响网络或输入,然后以更新的状态返回到它。 -
当你不想在计算的各个阶段都使用循环网络时,这是最好的选择。特别是 – 当你的网络很大时 – 引入循环层在参数数量方面是相当昂贵的(引入循环连接通常至少会使参数数量增加两倍)。所以你可以将静态网络作为预处理阶段 – 然后将结果输入到循环部分。这使得训练变得更容易。
-
模型是第3种情况的特殊情况。在这里 – 你有一系列通过one-hot编码编码的标记,然后使用
Embedding
进行转换。这使得过程占用的内存更少。 -
双向网络为你提供了一个优势,即在每个步骤不仅知道序列的前一个历史 – 还知道后续步骤。这是以计算成本为代价的,而且你也失去了顺序数据输入的可能性 – 因为进行分析时你需要拥有完整的序列。