KERAS:使用 return_sequence = True 获取 SLICE 的 RNN 时间步长

Posted

技术标签:

【中文标题】KERAS:使用 return_sequence = True 获取 SLICE 的 RNN 时间步长【英文标题】:KERAS: Get a SLICE of RNN timesteps with return_sequence = True 【发布时间】:2019-03-11 05:21:54 【问题描述】:

我的问题很简单,但似乎没有解决。

输入: (bs, timesteps, input_dim) --> Tensor("stack:0", shape=(?, 4, 400), dtype=float32 )

图层: output = LSTM(100, input_shape = (timesteps, input_feature), return_sequence = True) (input)

期望: (bs, timesteps, output_dim) --> Tensor("gru_20/transpose_1:0", shape=(?, 4, 100), dtype =float32)

输出:Tensor("gru_20/transpose_1:0", shape=(?, ?, 100), dtype=float32)

为什么 Keras 不推断时间步数,即使它接收到 input_shape?当我使用模型摘要时,它显示的结果具有正确的输出形状:


lstm_2 (LSTM) (无, 4, 100) 3232

但不是在施工期间。因此,当我想通过使用 unstack(output, axis=1)] 将张量解堆叠到每个时间步 * (bs, 10) 的张量列表时,我收到了这个错误:ValueError: Cannot infer num from shape (?, ?, 100)

我的错误在哪里?

顺便说一句。添加 TimeDistributed(Dense(100))(questions) 会导致正确的输出暗淡: Tensor("time_distributed_17/Reshape_1:0", shape=(?, 4, 100), dtype=float32) 但是由于共享权重,这不是一个选择。如果没有,解决方法是什么?

【问题讨论】:

我不知道为什么会这样,但是,作为一种解决方法,如果您需要输出正确的形状,您可以使用Reshape 层来强制它。 感谢您的回答。可能我做错了,因为我遇到了错误。使用:newoutput = Reshape((4, 100))(output) 应该导致 (None, 4, 100) 但错误:ValueError:新数组的总大小必须保持不变。通过使用 -1 进行推理,例如 newoutput = Reshape((-1, 100))(output) 再次导致 (?,?,100)。也不能与 TimeDistributed 结合使用 【参考方案1】:

解决方法可能是乘以 1(不变)。

workaround = TimeDistributed(Lambda(lambda x: x * 1.0))(output)

推理在这里起作用:

Tensor("time_distributed_17/Reshape_1:0", shape=(?, 4, 100), dtype=float32)

在使用return_sequences=True 时是否总是需要TimeDistributed 层?

【讨论】:

以上是关于KERAS:使用 return_sequence = True 获取 SLICE 的 RNN 时间步长的主要内容,如果未能解决你的问题,请参考以下文章

在较新版本的 Keras 中,LSTM 等效于 return_sequence = True

如何在 Keras、RepeatVector 或 return_sequence=True 中连接 LSTM 层?

理解 LSTM 中的输入和输出形状 | tf.keras.layers.LSTM(以及对于return_sequences的解释)

如何在 Keras 中同时获取 LSTM 或 GRU 的最后输出和完整序列?

Keras官方中文文档:循环层Recurrent

尝试从 Keras 运行顺序模型时出现 ValueError