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的解释)