LSTM中的Flatten层有什么作用?

我在使用Keras和IMDB数据库的一个子集创建一个用于情感分析的LSTM模型。当我在最后的Dense层前添加一个Flatten层时,我的训练、验证和测试准确率显著提高:

def lstm_model_flatten():    embedding_dim = 128    model = Sequential()    model.add(layers.Embedding(vocab_size, embedding_dim, input_length=maxlen))    model.add(layers.LSTM(128, return_sequences = True,  dropout=0.2))     # Flatten层    model.add(layers.Flatten())    model.add(layers.Dense(1,activation='sigmoid'))    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])    model.summary()    return model

模型很快就过拟合了,但验证准确率可以达到约76%:

Model: "sequential_43"_________________________________________________________________Layer (type)                 Output Shape              Param #   =================================================================embedding_42 (Embedding)     (None, 500, 128)          4768256   _________________________________________________________________lstm_63 (LSTM)               (None, 500, 128)          131584    _________________________________________________________________flatten_10 (Flatten)         (None, 64000)             0         _________________________________________________________________dense_40 (Dense)             (None, 1)                 64001     =================================================================Total params: 4,963,841Trainable params: 4,963,841Non-trainable params: 0_________________________________________________________________Epoch 1/714/14 [==============================] - 26s 2s/step - loss: 0.6911 - accuracy: 0.5290 - val_loss: 0.6802 - val_accuracy: 0.5650Epoch 2/714/14 [==============================] - 23s 2s/step - loss: 0.6451 - accuracy: 0.6783 - val_loss: 0.6074 - val_accuracy: 0.6950Epoch 3/714/14 [==============================] - 23s 2s/step - loss: 0.4594 - accuracy: 0.7910 - val_loss: 0.5237 - val_accuracy: 0.7300Epoch 4/714/14 [==============================] - 23s 2s/step - loss: 0.2566 - accuracy: 0.9149 - val_loss: 0.4753 - val_accuracy: 0.7650Epoch 5/714/14 [==============================] - 23s 2s/step - loss: 0.1397 - accuracy: 0.9566 - val_loss: 0.6011 - val_accuracy: 0.8050Epoch 6/714/14 [==============================] - 23s 2s/step - loss: 0.0348 - accuracy: 0.9898 - val_loss: 0.7648 - val_accuracy: 0.8100Epoch 7/714/14 [==============================] - 23s 2s/step - loss: 0.0136 - accuracy: 0.9955 - val_loss: 0.8829 - val_accuracy: 0.8150

使用相同的架构但不使用Flatten层(并在LSTM层上使用return_sequences = False),验证准确率仅为约50%。

这个帖子的评论建议在Dense层前使用return_sequences = False,而不是Flatten层。

但为什么会这样呢?如果Flatten层能提高我的模型性能,使用它是否可以?Flatten层在这里到底做了什么,为什么它能提高准确率?


回答:

LSTM层由不同顺序处理的LSTM单元组成。如下图所示,第一个单元接收输入/嵌入,计算隐藏状态,接下来一个单元使用其输入和前一个时间步的隐藏状态来计算自己的隐藏状态。基本上,单元之间的箭头也传递隐藏状态。如果你使用return_sequences=False,LSTM层只输出最后一个隐藏状态!(图中的h_4)。因此,所有输入和单元的信息都被嵌入到一个单一的固定大小的信息中,它无法包含大量信息。这就是为什么当你只使用最后一个隐藏状态时,准确率不高的原因。

当你使用return_sequences=True时,LSTM层输出每个隐藏状态,因此后续层可以访问所有隐藏状态,它们自然包含更多信息。然而,LSTM层返回一个矩阵。你也可以在模型摘要中看到这一点。它返回大小为(None, 500, 128)的矩阵。None基本上是批次中的样本数量,你可以忽略它。500是你的输入大小,128是你的隐藏状态大小。Dense层无法处理矩阵,它必须是一个向量。这就是为什么你需要应用Flatten层,它所做的基本上是将2D矩阵展开并表示为1D向量。因此,你的Flatten层的大小是64000,因为500*128 = 64000。当然,有了更多的隐藏状态,准确率会更好,因为它们包含了更多信息。LSTM网络的示例

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中创建了一个多类分类项目。该项目可以对…

发表回复

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