TensorFlow LSTMCell搭配RNN层的输出对应关系问题咨询
1 状态对应关系理解纠正
你的对应关系理解是完全颠倒的,正确的TF LSTM状态规则如下:tf.keras.layers.RNN封装LSTMCell且开启return_state=True时,返回值顺序固定为:
- 第一个返回值:输出内容,由
return_sequences控制格式:return_sequences=False时,仅返回最后一个时间步的隐藏态h_treturn_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
相关产品推荐
相关产品推荐

