使用TensorFlow实现Encoder-Decoder LSTM时设置H/C初始状态遇形状不兼容错误
问题分析与修复方案
1. 编码器初始状态设置错误+固定batch_size导致形状冲突
你要求编码器初始隐藏状态H为全1数组,但代码中错误使用了tf.zeros生成H;更关键的是,直接用固定张量tf.zeros([batch_size, cells])定义初始状态,会和训练时batch_size=50产生冲突——如果代码中batch_size变量值不等于50,就会触发形状不兼容错误。
修复代码:改用Lambda层动态生成初始状态,适配任意batch_size:
# 替换原h、c、init_states定义 def get_encoder_init_states(x): batch_size = tf.shape(x)[0] h = tf.ones([batch_size, cells]) # 按需求设置为全1 c = tf.zeros([batch_size, cells]) return [h, c] init_states = Lambda(get_encoder_init_states)(e_embed)
2. 解码器LSTM返回值解包错误
LSTM层设置return_state=True, return_sequences=True时,仅返回3个值:(输出序列, 隐藏状态h, 细胞状态c),但你写了d_outputs, _, _, = dSTM(...),试图解包4个值,这会直接引发解包错误,进而导致形状异常。
修复代码:修正解包数量:
d_outputs, _, _ = dSTM( d_embed, initial_state=e_states)
3. 训练数据拼写错误
model.fit中的ecoder_output_data是拼写错误,应为decoder_output_data,该错误会导致变量未定义,间接引发训练时的形状异常。
4. 缺失编码器输入层定义(推测)
代码中未看到e_inputs的定义逻辑,若缺失或形状与encoder_input_data不匹配,也会触发输入形状不兼容。需补充编码器输入层,确保形状与训练数据一致:
e_inputs = Input(shape=(m_questions,)) # m_questions为输入序列长度 e_embed = Embedding(VOCAB_SIZE, cells, mask_zero=True)(e_inputs)
修正后核心代码片段
# 补充编码器输入层 e_inputs = Input(shape=(m_questions,)) e_embed = Embedding(VOCAB_SIZE, cells, mask_zero=True)(e_inputs) # 动态生成编码器初始状态 def get_encoder_init_states(x): batch_size = tf.shape(x)[0] h = tf.ones([batch_size, cells]) c = tf.zeros([batch_size, cells]) return [h, c] init_states = Lambda(get_encoder_init_states)(e_embed) # 编码器LSTM(假设eSTM为已定义的单层LSTM,return_state=True) eSTM = LSTM(cells, return_state=True) e_lstm, es_h, es_c = eSTM(e_embed, initial_state=init_states) e_states = [es_h, es_c] # 解码器部分 d_inputs = Input(shape=(m_answers,)) d_embed = Embedding(VOCAB_SIZE, cells, mask_zero=True)(d_inputs) dSTM = LSTM(cells, return_state=True, return_sequences=True) d_outputs, _, _ = dSTM(d_embed, initial_state=e_states) DDense = Dense(VOCAB_SIZE, activation='softmax') output = DDense(d_outputs) model = Model([e_inputs, d_inputs], output) model.compile(optimizer=tf.keras.optimizers.RMSprop(), loss='categorical_crossentropy') # 修正拼写错误 model.fit([encoder_input_data, decoder_input_data], decoder_output_data, batch_size=50, epochs=15)
内容的提问来源于stack exchange,提问作者Corey Murphy
相关产品推荐
相关产品推荐

