Tensorflow RNN LSTM 输出解释
Posted
技术标签:
【中文标题】Tensorflow RNN LSTM 输出解释【英文标题】:Tensorflow RNN LSTM output explanation 【发布时间】:2021-09-21 13:25:42 【问题描述】:我有两个与tf.keras.layers.LSTMCell 相关的问题。我们看下面的代码:
inputs = tf.random.normal([32, 10, 8])
rnn1 = tf.keras.layers.RNN(tf.keras.layers.LSTMCell(4))
output = rnn1(inputs)
rnn2 = tf.keras.layers.RNN(
tf.keras.layers.LSTMCell(4),
return_sequences=True,
return_state=True)
whole_seq_output, final_memory_state, final_carry_state = rnn2(inputs)
从rnn2
的输出中,我可以看到final_memory_state
包含在whole_seq_output
中:
tf.reduce_all(whole_seq_output[:,-1,:]==final_memory_state)
<tf.Tensor: shape=(), dtype=bool, numpy=True>
因此,我认为final_memory_state
是最终的细胞状态,而whole_seq_output
包含所有细胞状态。此外,final_carry_state
是最终的隐藏状态。在这个众所周知的tutorial 中,单元状态和隐藏状态被称为 C_t 和 h_t。我的理解正确吗?
另外,从rnn1
,output
不是final_memory_state
或final_carry_state
之一:
>>> tf.reduce_all(output == final_carry_state)
<tf.Tensor: shape=(), dtype=bool, numpy=False>
>>> tf.reduce_all(output == final_memory_state)
<tf.Tensor: shape=(), dtype=bool, numpy=False>
我认为rnn1
和rnn2
之间的唯一区别是返回值的方式,因此output
应该是final_memory_state
或final_carry_state
之一。你能帮忙解释一下吗?
【问题讨论】:
【参考方案1】:经过多次测试,发现whole_seq_output
包含了不同时间步的所有输出,而final_memory_state
是最后一个时间步的输出。他们参考了上述教程中的h_t
。
此外,final_carry_state
是单元状态(即教程中的 C_t
)。
最后,output
确实是final_memory_state
。如果使用相同的单元格,它们的值应该相同(我使用了两个不同的单元格)。
inputs = tf.random.normal([32, 10, 8])
cell = tf.keras.layers.LSTMCell(4)
rnn1 = tf.keras.layers.RNN(cell)
output = rnn1(inputs)
rnn2 = tf.keras.layers.RNN(
cell,
return_sequences=True,
return_state=True)
whole_seq_output, final_memory_state, final_carry_state = rnn2(inputs)
【讨论】:
以上是关于Tensorflow RNN LSTM 输出解释的主要内容,如果未能解决你的问题,请参考以下文章
使用Tensorflow后端的Keras LSTM RNN中令人费解的训练损失与纪元...行为的任何原因
带有 LSTM 单元的 Keras RNN 用于基于多个输入时间序列预测多个输出时间序列