【问题标题】:How not to output a sequence with `TimeDistributed` layer in Keras?如何不在 Keras 中输出带有“TimeDistributed”层的序列?
【发布时间】:2017-07-23 18:37:56
【问题描述】:

我目前正在使用 Keras 研究 LSTM,我有一个关于 TimeDistributed 层的问题。

假设我有一个TimeDistributed 层,它接受(batch_size,timesteps,num_features1) 之类的输入。它将输出类似(batch_size,timesteps,num_features2) 的内容。

我想输出类似(batch_size,num_features2) 的内容。有可能吗?

将带有return_sequence = True 的 LSTM 层堆叠到密集层(使用 TimeDistributed 层),然后返回到接受 (batch_size,nb_features) 等输入的“经典”密集层。

提前致谢!

贝努瓦

【问题讨论】:

  • 这意味着你想压缩一个时间维度——你想怎么做?最流行的方法是global pooling wrt。计时或获取最后一个输出。
  • 这个想法可能是我可以返回(batch_size,timesteps) 之类的东西,而不是返回(batch_size,timesteps,num_features)。我会在global pooling lokk,谢谢。
  • 关于你的问题的标题,问题是,TimeDistributed 被应用并保留时间维度,所以无论如何它都会返回时间序列。 TimeDistributed 唯一可以影响的是每个时间步的特征数量。您可以通过应用其输出的维度为 1 的图层将其缩减为一个特征,然后展平。但是你不能从(无,时间步长,特征)到(无,feat_1,feat-2)。我仍然不确定我得到你的问题
  • @NassimBen 我认为他想到达 (None, Timesteps, 1) => (None, Timesteps)。也许这可以通过添加每个时间维度的所有特征来完成。例如,如果 TimeDistributed 层给出 (None, Timesteps, 100) 作为输出,那么对于每个时间步长,应该将 100 维向量相加以给出单个值。也许这可以工作,但我不确定我们如何实现这一点。

标签: machine-learning keras lstm


【解决方案1】:

我不确定是否完全了解您想要什么,所以我将在这里放置一个我认为是您想要的网络。如果不是,请使用您想要的网络草稿和每个步骤的形状来编辑您的问题。 也更容易知道你想用这个网络实现什么。

model = sequential()
# shape = (None,timesteps, num_feat1)
model.add(TimeDistributed(Dense(num_feat2))
# shape = (None,timesteps, num_feat2)
model.add(LSTM(1, return_sequence=True))
# shape = (None, timesteps, 1)
model.add(Flatten())
# shape = (None, timesteps)
model.add(Dense(num_outputs_desired))
# shape = (None, outputs)

这就是你想要的吗?这(1)在每个时间步上平均转换初始特征,密集层时间分布,(2)用 lstm 处理序列,在每一步返回 1 个值,(3)使用密集层将值序列转换为期望的输出(我不知道它应该是什么,你的模型的目的是什么?)。

【讨论】:

  • 是的,这正是我想要的!谢谢纳西姆。我不知道model.add(Flatten())
  • 欢迎 :) 很高兴它有帮助
猜你喜欢
  • 2019-03-28
  • 2019-03-12
  • 1970-01-01
  • 2017-08-03
  • 2020-11-02
  • 2020-10-16
  • 2017-11-03
  • 2018-04-28
  • 1970-01-01
相关资源
最近更新 更多