You need to enable JavaScript to run this app. TensorFlow LSTMCell搭配RNN层的输出对应关系问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow LSTMCell搭配RNN层的输出对应关系问题咨询

1 状态对应关系理解纠正

你的对应关系理解是完全颠倒的,正确的TF LSTM状态规则如下:
tf.keras.layers.RNN封装LSTMCell且开启return_state=True时,返回值顺序固定为:

  • 第一个返回值:输出内容,由return_sequences控制格式:
    • return_sequences=False时,仅返回最后一个时间步的隐藏态h_t
    • return_sequences=True时,返回所有时间步的隐藏态h_t组成的序列
  • 第二个返回值:最终时间步的隐藏态h_t(即通用LSTM教程里提到的对外输出的隐藏态)
  • 第三个返回值:最终时间步的细胞态c_t(即通用LSTM教程里提到的内部记忆细胞态)

你观察到tf.reduce_all(whole_seq_output[:,-1,:]==final_memory_state)返回True,刚好验证了上述规则:whole_seq_output存的是所有时间步的h_t,最后一个时间步的h_t自然和返回的第二个值完全相等。你自定义的变量名刚好把两个状态的定义搞反了:你命名的final_memory_state实际是最终h_t,final_carry_state才是最终的内部细胞态c_t,c_t不会出现在输出序列中。

2 rnn1和rnn2输出不一致的原因

你测试的rnn1和rnn2是两个独立初始化的层实例,两者的LSTMCell内部权重(四个门的权重、偏置参数)都是随机生成的,没有共享参数,因此输入相同张量得到的输出自然完全不同,和返回规则没有关系。

如果要验证返回规则的差异,需要让两个层共享同一组参数,测试代码如下:

import tensorflow as tf
inputs = tf.random.normal([32, 10, 8])
# 定义共用的LSTMCell,保证两个RNN层参数一致
shared_cell = tf.keras.layers.LSTMCell(4)

rnn1 = tf.keras.layers.RNN(shared_cell)
output = rnn1(inputs)

rnn2 = tf.keras.layers.RNN(
   shared_cell,
   return_sequences=True,
   return_state=True)
whole_seq_output, final_h, final_c = rnn2(inputs)

# 此时验证可得到True,说明rnn1的输出就是最后一个时间步的h_t
print(tf.reduce_all(output == final_h))

内容的提问来源于stack exchange,提问作者lenhhoxung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 00:48:01