了解 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() 和 GlobalAveragePooling2D() 有啥区别