Keras中LSTM的数学公式是什么?

3
根据wikipedia-lstm-math-equation中的数学公式,如下所示,应该只有隐藏状态h_t和细胞状态c_t。然而,当我试图在Keras上编写RNN代码时,有三个变量:lstm_outputstate_hstate_c
我现在想知道lstm_output的数学公式是什么? 以下是我的代码:
from keras.layers import Input, LSTM

lstm_input = Input(shape=(28, 10))

lstm_output, state_h, state_c = LSTM(units=32,
                                     return_sequences=True,
                                     return_state=True,
                                     unroll=True)(lstm_input)
print(lstm_output, state_h, state_c)

并且它给出了

Using TensorFlow backend.

(<tf.Tensor 'lstm_1/transpose_1:0' shape=(?, 28, 32) dtype=float32>, <tf.Tensor 'lstm_1/mul_167:0' shape=(?, 32) dtype=float32>, <tf.Tensor 'lstm_1/add_221:0' shape=(?, 32) dtype=float32>)
1个回答

1

让我们分解一下,从源代码中查看this line - return h, [h, c]:

  • lstm_output: 是每个时间步骤的h。因此它的形状为(batch_size, sequence_length, hidden_size),在您的情况下为(?, 28, 32)。正如文档所说,它作为序列返回,因为您设置了return_sequences=True
  • state_h: 是最后一个时间步骤的h,如果您可以检查,它应该等于lstm_output[:,-1]。请注意,它的形状为(?, 32),因为它是最后一个时间步骤的输出,而不是每个时间步骤。
  • state_c: 是最后一个时间步骤的c

这些方程通常以不同的方式实现,以优化某些特性,但它们都遵循原始论文。请注意,激活函数可能会有变化,例如在循环激活中使用hard_sigmoid,这些应在文档中清楚地注明。


2
不是因为 return_sequences,该层的输出总是会被返回的。这是每个层都会做的事情。return_sequences 将定义输出是否包含整个序列或仅最后一步。 - Daniel Möller
感谢你们两位的有用回答和评论。我尝试了两种情况。首先,使用return_sequences=True, return_state=True,它会给出lstm_output(3D)、state_h(2D)、state_c(2D),而且lstm_output[:, -1, :]等于state_h。其次,使用return_sequences=False, return_state=True,它会给出lstm_output(2D)、state_h(2D)、state_c(2D),而且lstm_output等于state_h - guorui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接