了解 Flatten 在 Keras 中的作用并确定何时使用它 [关闭]

Posted

技术标签:

【中文标题】了解 Flatten 在 Keras 中的作用并确定何时使用它 [关闭]【英文标题】:Understand the role of Flatten in Keras and determine when to use it [closed] 【发布时间】:2020-10-28 10:39:56 【问题描述】:

我正在尝试了解为时间序列预测开发的模型。它使用一个 Con1D 层和两个 LSTM 层,然后是一个密集层。我的问题是,它应该在 LSTM 和 Denser 层之间使用Flatten() 吗?在我看来,输出应该只有一个值,其形状为(None, 1),可以通过在 LSTM 和 Dense 层之间使用Flatten() 来实现。如果没有Flatten(),输出形状将为(None, 30, 1)。或者,我可以从第二个 LSTM 层中删除return_sequences=True,我认为它与Flatten() 具有相同的效果。哪种方式更合适?它们会影响损失吗?这是模型。

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv1D(filters=32, kernel_size=3, strides=1, padding="causal", activation="relu", input_shape=(30 ,1)),
    tf.keras.layers.LSTM(32, return_sequences=True),
    tf.keras.layers.LSTM(32, return_sequences=True),
    # tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(1),
    ])

这是没有Flatten()的模型摘要

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d (Conv1D)              (None, 30, 32)            128       
_________________________________________________________________
lstm (LSTM)                  (None, 30, 32)            8320      
_________________________________________________________________
lstm_1 (LSTM)                (None, 30, 32)            8320      
_________________________________________________________________
dense (Dense)                (None, 30, 1)             33        
=================================================================
Total params: 16,801
Trainable params: 16,801
Non-trainable params: 0
_________________________________________________________________

【问题讨论】:

【参考方案1】:

请参考此链接>>similar question.

flatten() 一般用在输出层之前。最好在 LSTM 层的全部输出上使用 flatten...可以在密集层之后使用,而不是在 LSTM 层之后使用。

我想在这里通过其他答案和cmets向计数器学习。

【讨论】:

谢谢,@Neerajan。所以给出我的例子,你的建议是使用 flatten 并在最后一个 Dense 层之后添加,对吗? 这是一个问题吗?还是答案?目前很难说。【参考方案2】:

嗯,这取决于你想要实现什么。我试着给你一些提示,因为我不是 100% 清楚你想要获得什么。

如果您的 LSTM 使用 return_sequences=True,那么您将返回每个 LSTM 单元的输出,即每个时间戳的输出。如果您随后添加一个密集层,其中一个将添加到每个 LSTM 层的顶部。

如果您将 flatten 层与 return_sequences=True 一起使用,那么您基本上是在删除时间维度,在您的情况下具有类似 (None, 30) 的内容。然后,您可以添加一个密集层或任何您需要的样式。

如果您设置return_sequences=False,您只会在 LSTM 的最后获得输出(请注意,在任何情况下,由于 LSTM 功能,它是基于之前时间戳发生的计算),并且输出的形状为(None, dim),其中dim 等于您在LSTM 中使用的隐藏单元的数量(即32)。同样,在这里,您可以简单地添加一个带有一个隐藏单元的密集层,以获得您正在寻找的东西。

【讨论】:

谢谢,@nsacco。你的解释很有帮助。所以我的下一个问题是,我应该什么时候使用你描述的每个选项?您提到这取决于我想要实现的目标。你能提供一个我什么时候想使用 Flatten() 的例子吗?我的标签是一个值,因此 Flatten() 将在最后一层为我提供 (None, 1) 的输出形状,它对应于标签尺寸。如果未展平,则输出形状为 (None, 30, 1) 并且与标签不一致。鉴于我的情况,使用 Flatten() 是否更有意义? 假设你想做一个类似于情绪分析的任务。您想以二进制分类方式对句子的情绪进行分类。我要做的是使用 LSTM 层来处理句子,使用return_sequences=False,我会在 LSTM 之后添加一个具有 1 个单元的密集层来管理分类部分。在此设置中,您的 NN 输出将为 (None, 1)。我会以这种方式进行,而不是使用展平层。 这是有道理的。我一直在考虑这一点,并认为在这种情况下不使用 Flatten 的另一个原因(时间序列预测或单词预测)可能是我们希望将时间步长作为维度之一。展平它会删除时间维度。感谢您的帮助!

以上是关于了解 Flatten 在 Keras 中的作用并确定何时使用它 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

keras中的Flatten和Reshape

keras 中的 Flatten() 和 GlobalAveragePooling2D() 有啥区别

keras---cnn---rnn---lstm

Keras 的功能类似于 Torch 中的视图

Keras 中 TimeDistributed 层的作用是啥?

从Keras Layer获得权重